vc++ 和 clang 中的 c++ typename

c++ typename in vc++ and clang

以下代码:

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

};

vc++ 可以。 clang 输出:错误:之后需要一个合格的名称 'typename' 使用 TT = typename T; .

如果你改变

using TT = typename T; 

using TT = T; 

,vc++ 和 clang 都可以。

为什么?

编译器已经知道 T 是一个类型名称,因为你在 class 模板中声明了它,所以你应该 using TT = T 而不是 using TT = typename T。 VC++ 不遵循所有 ISO 标准,因此一些在 gcc 或 clang 中编译失败的代码可能在 VC++

中工作

您的代码是不正确的 C++。 C++ 语法指定关键字 typename(除了它用于声明模板参数的其他用途之外)只能用在 qualified-id 的开头,即至少包含一个 :: 标记的名称。

显然 MSVC 在这里允许更宽松的语法。

(typename 必须 在模板中的大多数上下文中使用,只要 qualified-id 是依赖项name 应该是类型,而不是变量或模板。这里 "dependent name" 大致意味着编译器不能确定为它找到声明,因为依赖于模板参数。但它也是有效的在不依赖或根本不在模板中的 qualified-id 上使用关键字。)