0

我有一个模板:

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;
}

有没有人有任何想法?谢谢

4

2 回答 2

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
于 2012-12-28T14:29:50.453 回答
0

函数模板是一个蓝图,它告诉编译器在实例化函数(即在代码中使用模板函数时)如何为函数生成代码。

编译器将生成的确切内容取决于模板参数的实例化值。那时必须知道并最终确定这些值,否则编译器不知道要生成什么代码。

于 2012-12-28T18:28:59.210 回答