我不明白为什么只能用const变量初始化模板参数。 因为,为什么以下代码不起作用:
#include <iostream>
template <class T,int dim>
class Vec
{
T _vec[dim];
int _dim;
public:
Vec () : _dim(dim) {};
~Vec () {};
// other operators and stuff
};
int main () {
int dim = 3;
Vec < int, dim> vecInt3;
}
如果我在main中添加一个const到dim的定义,一切都很好。那是为什么?
答案 0 :(得分:3)
整数类型参数必须是编译时常量。您必须使用整数文字或使变量const
。原因是模板在运行时被实例化,如果有可能以后更改变量名,程序将与模板不一致。
答案 1 :(得分:0)
我认为,那是因为你无法在T _vec[dim]
中创建一个变量作为长度的表。为什么不考虑内置的矢量类型呢?
答案 2 :(得分:0)
首先,模板是在编译时构建的,这就是必须使用const值的原因:它无法在运行时计算。事实上,当您编译代码时,对于每个不同的参数使用,类将被编译一次。
在此之后,如果没有其他语法错误,代码应该可以工作。
在你发疯之前的一个重要注意事项:你不能在header / cpp文件中拆分模板,你必须在同一个文件上编写标题和实现!
答案 3 :(得分:0)
因为模板参数应该在编译时计算。编译器将为不同的参数编写代码。
在您的情况下,您可以看到如果dim
不是const,编译器将不知道应为vecInt3
分配多少空格。实际上Vec<int, 1>
和Vec<int, 2>
是不同的类型。
如果你想要一个动态大小的矢量,你可以看到std::vector
以获得一些想法。