4

我不确定该主题是否与我正在寻找的主题完全匹配,但基本上是:

我可以做这个:

struct something {
    int d;
} somethingType;

但为什么我不能这样做?

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

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

4

3 回答 3

3

从语法上讲,我认为您可以,但是受到其他限制的禁止:

[温度]/1

模板定义了一个类或函数族或类型族的别名。

   模板声明:
     template < 模板参数列表 > 声明

   模板参数列表:
     模板参数
     模板参数列表 , 模板参数

[...]

模板声明中的声明应

  • 声明或定义一个函数或一个类,或
  • 定义类模板或嵌套在类模板中的类的成员函数、成员类、成员枚举或静态数据成员,或
  • 定义类或类模板的成员模板,或
  • 是一个别名声明

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

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

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

声明
块声明
简单声明
decl-specifier-seq opt                     init-declarator-list opt ;
type-secifier init-declarator-list opt ;
类说明符 init-declarator-list opt类头{成员规范选择}   初始化声明器列表选择类头{成员规范选择}   初始化声明器类头{成员规范选择}   声明器初始化器opt ;
类头{成员规范选择}    ptr-declarator类头{成员规范opt }    noptr-declaratorclass-head { member-specification opt }    declarator-id attribute-specifier-seq opt ;
类头{成员规范opt } ... opt id-expression ;

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

但这将是一个变量的声明,这在模板案例中是不允许的。

于 2013-11-12T22:39:23.227 回答
2

我不认为你可以。

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

于 2013-11-12T22:32:02.863 回答
1

一个type-specifier可以

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

如您所见,template-declaration不包括在内,因此您要查找的内容不存在(直接)

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

于 2013-11-12T22:38:46.930 回答