在C ++中,以下是合法的:
template <int i>
run(){...}
run<3>(); // legal
const int j=3;
run<j>(); // legal because j is const
为什么以下是或不合法?
template <String s>
run(){...}
run<"hello">(); // legal or illegal?
const string s="hello";
run<s>(); // legal or illegal?
答案 0 :(得分:6)
来自C ++ 11标准:
14.1模板参数
...
4非类型模板参数应具有以下之一(可选 cv-qualified )类型:
- 整数或枚举类型,
- 指向对象的指针或指向函数的指针,
- 对象的左值引用或函数的左值引用,
- 指向成员的指针,
-std::nullptr_t
。
因此,您不能将类用作非类型模板参数。
答案 1 :(得分:1)
int
是合法的,因为编译器知道int
。另一方面,String
不是内置的C ++数据类型。它在头文件库中定义。常量“hello”是一个字符数组,而不是String()
。