对模板的整数:不能出现在常量表达式中

时间:2015-01-27 20:13:52

标签: c++ templates

我从未做过模板编程。我需要的是:根据某个整数(用户输入),我的模板应该确定一个类型。这是我的模板:

template<int T> struct abcd {};

template<>
struct abcd<6> { typedef double type_t; };
template<>
struct abcd<5> { typedef float type_t; };
template<>
struct abcd<0> { typedef unsigned char type_t; };enter code here

在某些功能中,我想使用我的模板:

void foo(int i, int m)
{
    const int j = i;
    // Assume elements of A can be accessed as A.at<dataType>(location)
    int a = A<abcd<j>::type_t>(m)
   //do something.. 
}

这显示错误cannot appear in a constant-expression。请告诉我我做错了什么,可以解决什么问题。请注意,如果我将const int j = 5或任何其他相关的int代替const int j = i,那么它可以正常工作。那令我困惑。

3 个答案:

答案 0 :(得分:2)

abcd<j>必须在编译时实例化,因此j必须是常量表达式。在您的情况下,您在编译时不知道j,因为它是从函数foo的参数中获取的,这就是错误的原因。

即使您调用foo(6,...),函数的参数也不被视为常量表达式。参数6虽然在编译时已知,但它与参数i有关,它本身不是一个常量表达式。

你可能有类似

的东西
foo(constexpr i, int m)

但是这样的语法是非法的,也就是说,函数参数不能是常量表达式。我不知道为什么标准不允许这样的结构,我更愿意听到任何意见。

解决方法是声明fooi作为模板,例如

template<int i>
void foo(int m)
{
    const int j = i;
    // now can use j as a constant expression
}

并将其调用为例如。

f<5>(...);

答案 1 :(得分:1)

在编译期间必须知道j的值。

答案 2 :(得分:1)

请注意,模板参数需要在编译时中获知。您已将j声明为常量,但在编译时不知道