VC 和Clang中的C 打字机

c++ typename in vc++ and clang

本文关键字:打字机 中的 Clang VC      更新时间:2023-10-16

以下代码:

template<typename T>
struct A{
    using TT = typename T;
};

vc 还可以。clang输出:错误:期待一个合格的名称使用tt = typeName t;'typeName';。

如果您更改

using TT = typename T; 

to

using TT = T; 

,vc 和clang还可以。

为什么?

您的代码不正确C 。C 语法指定关键字typename(除其他用于声明模板参数的用途外(只能在A gem>合格的ID 的开头使用,该名称至少包含一个:: Token。

显然MSVC允许此处更宽敞的语法。

(typename 必须在模板中的大多数上下文中使用,只要 gem> gem> gem> griped-iD 是一个应该是类型的依赖性名称,而不是变量或一个变量模板。在这里大致表示编译器无法确定为其找到声明,这是由于取决于模板参数。但是,在合格 - ID上使用关键字也有效>这不是依赖的,或者根本不依赖。(

编译器已经知道T是类型名称,因为您在类模板中声明了它,因此您应该using TT = T而不是using TT = typename T。VC 并不遵循所有ISO标准,因此某些未能在GCC或Clang中编译的代码可以在VC

中使用