我有一个模板:
template<unsigned int N> struct IntN;
template <> struct IntN< 8> {
typedef uint8_t type;
};
template <> struct IntN<16> {
typedef uint16_t type;
};
主要是我通过这样做初始化和交替:
IntN< 8>::type c;
然而,这似乎有效,当我将值存储在变量中时,它没有,我得到以下错误:
错误:类型为'int'的非类型模板参数不是整数常量表达式
以下是代码示例:
template<unsigned int N> struct IntN;
template <> struct IntN< 8> {
typedef uint8_t type;
};
template <> struct IntN<16> {
typedef uint16_t type;
};
int main(int argc, char *argv[]) {
int foo = 8;
IntN<foo>::type c;
}
有没有人有任何想法?感谢
答案 0 :(得分:7)
整数模板参数的模板参数必须是常量表达式。积分文字是一个常量表达式
IntN<8>::type c;
用常量表达式初始化的常量变量是常量表达式
const int n = 8;
IntN<n>::type c;
这里n是可以的,因为它既是const又是由常量表达式(8)初始化的。以下内容不会编译:
int n = 8;
const int m = n;
IntN<n>::type c; //error n is not const therefore not a constant expression
IntN<m>::type c; //error m is const but initialized with a non-constant expression therefore not a constant expression
答案 1 :(得分:0)
功能模板是一个蓝图,它告诉编译器如何为实例化函数生成代码(即使用时)代码中的模板函数。)
编译器将生成的 取决于模板参数的实例化值。这些值必须已知并最终确定,否则编译器不知道要生成什么代码。