2010-10-02 187 views
3

据我所知,模板值需要在编译时间内知道。 所以我写了一个小例子来看看我明白了,但是很明显我没有。 ,所以我得到这样的:模板值'defValue'不能出现在常量表达式中

`defValue' cannot appear in a constant- 
expression 

谁能请什么问题以及如何修复?

#include <iostream> 
template <class T,T defaultVal, int dim=255> 
class Vec 
{ 
    T _vec[dim]; 
    int _dim; 
    public: 
    Vec() : _dim(dim) 
    { 
     for (int i=0;i<_dim;++i) 
     { 
     _vec[i] = defaultVal; 
     } 
    } 
    ~Vec() {}; 
// other operators and stuff 
}; 

int main() 
{ 
    int defValue = 0; 
    Vec < int,defValue > vecWithDefVal;// here is the problem but i don't know why 
} 

回答

1

C++ 03 14.3.2

模板非类型参数

模板参数的用于非类型的,非模板的模板参数应是以下之一:

- 积分或枚举类型的积分常量表达式;或

- 一个非类型模板参数的名称;或

- 一个对象或功能具有外部链接,包括功能模板和功能 模板的IDS,但不包括非静态类成员的地址,表示为& ID-表达其中&是 可选如果名字指到函数或数组,或者如果相应的模板参数是引用;或 - 指向成员的指针,如5.3.1所述。

defValue [是非类型参数]既不是上述情况。

int defValue = 0;更改为const int defValue = 0并且您的代码将编译[请参阅第一个条件]。

或者直接写Vec <int,0> vecWithDefVal;

+0

'const int的利用DefValue = 0;'不VC++或GCC下工作。 – 2010-10-02 10:31:49

+3

[应该可以](http://ideone.com/G1ZpC)。它也适用于我的MSVS :) – 2010-10-02 10:34:01

+0

奇怪的是,我必须引入一个错字。所以是的,它确实有效! – 2010-10-02 10:36:25

1

模板只能通过基本类型的类型和编译时常量进行参数化。所以Vec < int,0 > vecWithDefVal;会没事的。