C ++,模板的非参数类型:只有const变量?

时间:2011-09-22 10:08:00

标签: c++ templates vector const

我不明白为什么只能用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的定义,一切都很好。那是为什么?

4 个答案:

答案 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以获得一些想法。