为什么下面的代码是错误的?模板接受哪种类型的参数?
class MyClass
{
int var;
};
template <MyClass a> struct s
{
};
int main()
{
MyClass var;
struct s<var>;
return 0;
}
非类型模板参数是有约束的,不是什么都可以用。特别是,它们必须是编译时常量,这不是你的情况。关于您的模板定义:
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),它指定具有静态存储持续时间和外部或内部链接的对象或具有外部或内部链接的函数的地址,包括函数模板和函数模板 ID,但不包括非静态类成员,表示为 (忽略括号)作为 & id 表达式,但如果名称引用函数或数组,则 & 可以省略,如果相应的模板参数是引用,则应省略;或者
— 一个常量表达式,计算结果为空指针值 (4.10);或者
— 一个常量表达式,其值为空成员指针值 (4.11);或者
— 一个指向成员的指针,如 5.3.1 所述。