我不确定这个主题是否与我想要的完全匹配,但这里基本上是:
我可以这样做:
struct something {
int d;
} somethingType;
但为什么我不能这样做?
template <bool T>
struct somethingelse {
int d;
}<true> somethingelseType;
如果可以做第二个,那么这样做的正确方法是什么?
答案 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