对嵌套类使用类型别名
Using type aliases with nested classes
我在使用类型别名和嵌套类/作用域时遇到了一个奇怪的问题。以下代码被 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 在技术上不符合要求,但这里有错误会很好。
相关文章:
- 继承模板类中的类型别名
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 如何使用类型别名从模板化类中隐藏模板列表
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- 通过类型别名从构造函数转发模板推导
- C++中的严格别名规则和类型别名
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 什么是C++中的类型别名?
- 如何在不违反类型别名规则的情况下解释消息负载?
- 在模板派生类中继承具有类型别名的构造函数
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 使用类型别名,例如使用 A = int(int)
- 模板类函数指针类型别名
- 类型别名和类似类型
- 泛型类型别名,它们彼此不兼容
- 具有类型别名的循环依赖项
- 为什么模板引用类型不能用作模板类型别名参数?