为什么这样做?
char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;
但是这个(有一个常数变量)不是吗?
const char __nontype[] = "foo";
typedef TemplateClass<T, __nontype> MyClass;
编译器错误:
错误:'__ nontype'不能出现在常量表达式
中错误:模板参数2无效
答案 0 :(得分:6)
不同之处在于const
会影响链接。如果您添加extern
,它会起作用。那就是说,据我所知:
14.3.2模板非类型参数[temp.arg.nontype]
非类型非模板模板参数的模板参数应为以下之一:
- 一个整数常量表达式(包括可用作5.19中描述的整数常量表达式的文字类型的常量表达式);或
- 非类型模板参数的名称;或
- 一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址,或具有外部或内部链接的函数,包括函数模板和函数模板ID,但不包括非静态类成员,表达(忽略括号)为&amp; id-expression,除了&amp;如果名称引用函数或数组,则可以省略,如果相应的模板参数是引用,则应省略;或
- 一个求值为空指针值的常量表达式(4.10);或
- 一个常量表达式,其值为null成员指针值(4.11);或
- 指向成员的指针,如5.3.1所述。
它也可以在没有extern
的情况下工作。允许该对象具有内部链接,但您的编译器尚不支持该内容。这是C ++ 11中的一个变化,之前的C ++标准不允许它。
答案 1 :(得分:1)
错误说明:结果不是常量表达式(在链接时已知,但不是编译时间)。
以下是 工作的示例:
typedef const char *nontype_t;
template <nontype_t> struct Y {};
char hello[] = "hello";
constexpr char* world = hello;
int main()
{
Y<hello> a;
}