模板不能接受对象作为参数

时间:2013-03-02 13:50:52

标签: c++ templates

为什么以下代码出错?模板接受哪种参数?

class MyClass
{
    int var;
};

template <MyClass a> struct s
{

};

int main()
{
    MyClass var;
    struct s<var>;


    return 0;
}

1 个答案:

答案 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所述。

相关问题