2011-09-22 110 views
1

我不明白为什么模板参数只能用const变量初始化。 作为,为什么不将下面的代码工作:C++,模板的非参数类型:只有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; 
} 

如果我添加一个const在主,一切的朦胧的定义是罚款。这是为什么?

回答

3

整数类型参数必须是编译时常量。您必须使用整数字面量或使您的变量const。原因是模板在运行之前被实例化,并且如果您稍后可能更改变量名称,则程序将表现出与模板不一致的情况。

0

我想,这是因为你不能在T _vec[dim]中创建一个带有变量的表作为长度。为什么不考虑内置的矢量类型呢?

+0

这样可以避免这个问题(在模板中不需要'dim'),但不能解释原因。 – MSalters

0

首先,模板在编译时建,这就是为什么你必须使用一个常量的值:它不能在运行时进行计算。事实上,当你编译你的代码时,这个类将被编译一次,以用于每个不同的参数使用。

之后,代码应该工作,如果没有其他语法错误。

发疯之前的一个重要注意事项:无法在头文件/ cpp文件中拆分模板,必须在同一文件中编写头文件和实现文件!

0

因为模板参数应该在编译时计算。编译器将为不同的参数编码。

就你而言,你可以看到如果dim不是一个const,编译器就不知道应该为vecInt3分配多少空间。实际上Vec<int, 1>Vec<int, 2>是不同的类型。

如果你想要一个具有动态大小的矢量,你可以看到std::vector得到一些想法。