在定义时初始化模板结构

时间:2013-11-12 22:24:56

标签: c++ templates struct template-specialization

我不确定这个主题是否与我想要的完全匹配,但这里基本上是:

我可以这样做:

struct something {
    int d;
} somethingType;

但为什么我不能这样做?

template <bool T>
struct somethingelse {
    int d;
}<true> somethingelseType;

如果可以做第二个,那么这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

我认为你可以在语法上,但它被其他限制所禁止:

[温度] / 1

  

模板定义了一系列类或函数或一系列类型的别名。

     

模板声明:
  template < template-parameter-list > 声明

     

template-parameter-list:
  模板参数
   template-parameter-list , template-parameter

     

[...]

     

模板声明中的声明

     
      
  • 声明或定义函数或类,或
  •   
  • 定义成员函数,成员类,成员枚举或类模板或嵌套在类模板中的类的静态数据成员,或
  •   
  • 定义类或类模板的成员模板,或
  •   
  • alias-declaration
  •   

声明(顶级语法结构)可以是模板声明,因此这些规则直接适用于声明。

另一方面(即对于非模板类),声明也可以是块声明 [dcl.dcl] / 1,它可以是一个简单声明,它可以包含一个 decl-specifier-seq ,它可以包含一个类型说明符 [dcl.type] / 1可以是一个类说明符,它可以声明一个类oO并使用这个类型说明符你可以声明一个变量:

(将每行一个构造解析为其(可能的)组件)

declaration
block-declaration
simple-declaration
decl-specifier-seqopt                    init-declarator-listopt ;
type-secifier                           init-declarator-listopt ;
class-specifier                         init-declarator-listopt ;
class-head { member-specificationopt }   init-declarator-listopt ;
class-head { member-specificationopt }   init-declarator ;
class-head { member-specificationopt }   declarator initializeropt ;
class-head { member-specificationopt }   ptr-declarator ;
class-head { member-specificationopt }   noptr-declarator ;
class-head { member-specificationopt }   declarator-id attribute-specifier-seqopt ;
class-head { member-specificationopt }   ...opt id-expression ;

现在匹配,例如struct something { int d; } somethingType;

但这将是变量的声明,模板案例不允许这样做。

答案 1 :(得分:2)

我认为你不能。

您可以按对象名称(根据http://www.cplusplus.com/doc/tutorial/structures/)跟踪结构,而不是通过模板参数。

答案 2 :(得分:1)

type-specifier可以是

  • trailing-type-specifier
  • class-specifier
  • enum-specifier

如您所见,template-declaration未包含在内,因此您所寻找的内容并不存在(直接)

查看超链接的C ++ 11语法规则的在线版本:http://www.nongnu.org/hcb/#type-specifier