C++ 不同意在嵌套类中使用类型别名

C++ 不同意在嵌套类中使用类型别名,c++,templates,portability,type-alias,C++,Templates,Portability,Type Alias,clang++和g++对以下代码的有效性存在分歧: template<typename T> struct thing { struct nested { typename thing::type num; }; using type = int; }; 模板 结构物{ 嵌套结构{ typename事物::type num; }; 使用type=int; }; g++(4.8及以上版本)的所有版本都编译了此文件,而clang(3.0及以上版

clang++和g++对以下代码的有效性存在分歧:

template<typename T>
struct thing {
    struct nested {
        typename thing::type num;
    };
    using type = int;
};
模板
结构物{
嵌套结构{
typename事物::type num;
};
使用type=int;
};
g++(4.8及以上版本)的所有版本都编译了此文件,而clang(3.0及以上版本)的所有版本都抱怨未定义
thing::type

显然,如果
东西
不是一个模板,两个编译器都不会接受,但谁是正确的,为什么


提前谢谢。

太棒了。我猜如果模板
对象
被实例化,事情就会改变。(我用C++17在wandbox.org上对clang HEAD和gcc HEAD进行了测试。我添加了一个成员
T值;
,我可以初始化和输出)。但是,gcc仍然会启动和运行-clang不会编译。是的,对吗?很奇怪。在编译器的几个主要修订版本中,对于简单代码的有效性存在明显的分歧,这是很少见的。我假设clang在这里必须“更”正确,但我想知道这是否是标准规定“无需诊断”的情况之一,因此gcc在技术上不是错误的。