为什么以下代码出错?模板接受哪种参数?
class MyClass
{
int var;
};
template <MyClass a> struct s
{
};
int main()
{
MyClass var;
struct s<var>;
return 0;
}
答案 0 :(得分:4)
非类型模板参数受到约束,并非所有内容都可以使用。特别是,它们必须是编译时常量,而不是你的情况。关于您的模板定义:
template <MyClass a> struct s
// ^^^^^^^
{
};
参见C ++ 11标准的第14.1 / 4段:
非类型模板参数应具有以下(可选的cv限定)类型之一:
- 整数或枚举类型,
- 指向对象或指向函数的指针,
- 对对象的左值引用或对函数的左值引用,
- 指向成员的指针,
- std :: nullptr_t。
如您所见,不允许使用用户定义的类型。关于模板的实例化,然后:
struct s<var>;
// ^^^ You most likely meant something like s<var> obj, but nevermind
参见C ++ 11标准的第14.3.2 / 1段:
非类型非模板模板参数的模板参数应为之一:
- 对于整数或枚举类型的非类型模板参数,转换的常量表达式 (5.19)模板参数的类型;或
- 非类型模板参数的名称;或
- 一个常量表达式(5.19),用于指定具有静态存储持续时间和的对象的地址 外部或内部链接或具有外部或内部链接的功能,包括功能模板 和函数template-ids但不包括非静态类成员,表示(忽略括号)为 &安培; id-expression,除了&amp;如果名称引用函数或数组,则可以省略 如果相应的模板参数是引用,则省略;或
- 一个求值为空指针值的常量表达式(4.10);或
- 一个求值为空成员指针值的常量表达式(4.11);或
- 指向成员的指针,如5.3.1所述。