为什么typedef模板是非法的?

从实际的角度来看,我明白typedeftest都有些“多余”,如果我们想要编译下面的代码,需要将其删除:

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声明的模板就不会像现在这样“酷”,并且两者都没有意义。

    链接地址: http://www.djcxy.com/p/78657.html

    上一篇: Why are typedef templates illegal?

    下一篇: How to declare a function return a pointer to function return pointer to int[3]