对嵌套类使用类型别名

Using type aliases with nested classes

本文关键字:类型 别名 嵌套      更新时间:2023-10-16

我在使用类型别名和嵌套类/作用域时遇到了一个奇怪的问题。以下代码被 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 编译?代码是有效还是无效?

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

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

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

不需要诊断,因此 clang 在技术上不符合要求,但这里有错误会很好。