为什么typedef模板是非法的?
  从实际的角度来看,我明白typedef和test都有些“多余”,如果我们想要编译下面的代码,需要将其删除: 
template< typename type_t >
typedef struct tagTest
{
    int a;
} test;
但是,我认为typedef声明集是声明集的一个子集。 他们碰巧有那个特定的decl-specifier。 那是我的理性化
typedef struct tagTest
{
    int a;
} test;
  引入标识符test 并声明结构tagTest 。  如果这种解释是正确的,那么标准中的以下段落应该允许template typedef (尽管不是关键字using给出的含义)。 
模板声明中的声明应 - (1.1)声明或定义一个函数,一个类或一个变量,或 - (1.2)定义一个成员函数,成员类,成员枚举或静态数据成员类模板或嵌套在类模板中的类,或 - (1.3)定义类或类模板的成员模板,或者 - (1.4)是别名声明。
我在推理中看不到错误,但结论是非法的。
解决上述难题的标准有哪些相关部分?
  更新部分上述推理使用了typedef struct声明结构的事实。  就我所知, typedef说明符暗示所有声明的变量都是类型。  也就是说, typedef升级会从单纯的变量test为与声明的tagTest等效的类型。  这就是为什么下面的代码编译(虽然有警告)。 
typedef struct tagTest
{
    int a;
};
tagTest t;
  其中一个答案照顾了多余的test 。  但是,可以在没有声明的情况下使用typedef,因为“在声明命名类/结构/联合或命名枚举时,Init-declarator-list是可选的” 
在C ++ 11之前不允许使用模板类型定义,并且引入了C ++ 11模板别名来解决这些问题。 (CFR)。 C ++模板typedefs和维基百科。
  正如你所指出的那样,因为标准不允许typedef在那里,所以代码是无效的 
别名声明:
 using identifier attribute-specifier-seqopt= type-id ;
  typedef声明不是别名声明。 
此外,如果您声明了一个类模板,则不能拥有一个声明器,但是该标准明确禁止它
[温度] / P3
在模板声明,显式专门化或显式实例化的情况下,声明中的init-declarator-list最多只能包含一个声明器。 当使用这样的声明来声明类模板时,不允许声明器 。
所以甚至不会编译以下内容
template< typename type_t >
struct tagTest
{
    int a;
} test;
编辑:
这是没有说明的
typedef struct S { };
应该是一个错误,因此gcc和clang都会接受警告。 我假设Clang指望[temp] / 3在typedef与模板一起使用的情况下发出错误,而gcc立即拒绝此代码
template<typename T>
typedef struct S { };
(CFR)。 铿锵虫22249
C不支持模板和
typedef struct tagX {
} X;
在C ++语法是退化C,那里允许继续支持C头等,而不是在实际的C ++中使用。
上述的C ++语法是
struct X {};
(支架放置时的YMMV)
  与typedef定义的内容无关,这是一个typedef声明,在这些情况下未列出: 
  而要明确typedef声明不是别名声明。  标准§7中的语法指定的别名声明是: 
别名声明:
 using identifier attribute-specifier-seqopt= type-id ; 
  更何况,如果这是可能的话,那么using声明的模板就不会像现在这样“酷”,并且两者都没有意义。 
上一篇: Why are typedef templates illegal?
下一篇: How to declare a function return a pointer to function return pointer to int[3]
