使用具有嵌套类的类型别名

时间:2013-10-07 18:27:33

标签: c++ c++11 alias using nested-class

我遇到了使用类型别名和嵌套类/作用域的奇怪问题。 clang 3.3很高兴接受以下代码,但是被nuwen MinGW 4.8.1拒绝了

template<typename T>
struct container
{
};

struct Outer
{
    using type_t = int;
    struct Inner
    {
        using container_t = container<type_t>;
        using type_t = Outer::type_t; //error in MinGW
    };
};

gcc:http://ideone.com/cba6Fp生成的错误(与我系统上的错误匹配)

要修复MinGW中的错误,只需将container_t的定义移至type_t之后(这是有意义的,也是我原本应该做的) - 不过我的问题是为什么这样做?用clang而不是MinGW编译?代码有效还是无效?

1 个答案:

答案 0 :(得分:2)

问题出在3.3.7 / 1 [basic.scope.class]:

  

2)在S类中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估。违反此规则不需要诊断。

您在type_t中使用名称Inner,但在声明Inner::type_t之前。所以这个名字指的是两个不同的声明,违反了规则。

不需要诊断,所以clang在技术上不符合要求,但这里的错误会很好。