我从未做过模板编程。我需要的是:根据某个整数(用户输入),我的模板应该确定一个类型。这是我的模板:
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
,那么它可以正常工作。那令我困惑。
答案 0 :(得分:2)
abcd<j>
必须在编译时实例化,因此j
必须是常量表达式。在您的情况下,您在编译时不知道j
,因为它是从函数foo
的参数中获取的,这就是错误的原因。
即使您调用foo(6,...)
,函数的参数也不被视为常量表达式。参数6
虽然在编译时已知,但它与参数i
有关,它本身不是一个常量表达式。
你可能有类似
的东西foo(constexpr i, int m)
但是这样的语法是非法的,也就是说,函数参数不能是常量表达式。我不知道为什么标准不允许这样的结构,我更愿意听到任何意见。
解决方法是声明foo
将i
作为模板,例如
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
声明为常量,但在编译时不知道