kmeans.h
#include <iostream>
#include <vector>
template <class T,int DIM>
class array_dim
{
private:
T arr[DIM];
public:
array_dim() {};
explicit array_dim(const T &v);
virtual T & operator [](int i);
virtual T operator [](int i)const;
};
template<class T,int DIM>
array_dim<T, DIM>::array_dim(const T & v)
{
for (int i = 0; i < DIM; i++)
{
arr[i] = v;
}
};
template <class T,int DIM>
T & array_dim<T, DIM>::operator[](int i)
{
if (i < 0 || i >= DIM)
{
std::cerr << "Error in array dim out of range\n";
std::exit(EXIT_FAILURE);
}
return arr[i];
};
template<class T,int DIM>
T array_dim<T, DIM>::operator[](int i) const
{
if (i < 0 || i >= DIM)
{
std::cerr << "Error in array limits:\n";
std::exit(EXIT_FAILURE);
}
return arr[i];
}
template<class items,int dim1,int dim2,int n_cluster>
array_dim<int, dim2> Kmeans (array_dim<array_dim<items, dim1>,dim2> values, array_dim<array_dim<items,dim1>,n_cluster> centers,const items &T)
{
using std::vector;
array_dim<int, dim2> flags_of_points;
array_dim<vector<array_dim<items, dim1>>, n_cluster> summations;
return flags_of_points;
}
test.cpp
#include"kmeans.h"
int main()
{
//initialization can be skipped
array_dim<array_dim<double, 1>, 10> temp;
srand(time(NULL));
int i;
for (i = 0; i < 3; i++)
{
temp[i][0] =(double) std::rand()/RAND_MAX*0.1;
}
for (i = 3; i < 10; i++)
{
temp[i][0] = (double) (std::rand()/ RAND_MAX * 0.1+0.7);
}
array_dim<array_dim<double, 1>, 2> centers;
centers[0][0] = 0.05;
centers[1][0] = 0.7;
array_dim<int, 10> allflags;
//using the function
allflags = Kmeans (temp, centers, 0.0);
return 0;
}
使用vs2017编译上述程序时,它不会通过。该错误表明代码array_dim<std::vector<array_dim<double, 2>>, 3> summations
需要简化。
完整的错误消息:
致命错误C1001:编译器发生内部错误。 编译器文件“ msc1.cpp”,行1518要解决此问题,请尝试 在上面列出的位置附近简化或更改程序
我想知道是否有问题像上述那样递归实现模板?我将一个复杂的模板函数定义为Kmeans。实际上是该函数中的错误发生了