下面是一个纯学术发明的类层次结构。
struct X{
void f1();
void f2();
void f3();
};
struct Y : private X{
void f4();
};
struct Z : X{
};
struct D : Y, Z{
using X::f2;
using Z::X::f3;
};
int main(){}
我希望使用 X::f2 的声明是模棱两可的,因为“X”是“D”的模棱两可的基础(X 的可见性与可访问性)。但是 g++ (ideone.com) 编译得很好。
我检查了 Online Comeau,它在按预期使用 X::f2 声明时出错。但是,它也为使用 Z::X::f3 的声明提供了歧义。
那么预期的行为是什么?
编辑1:
请参考标准的适当部分。
编辑2:
我检查了 VS 2010,它只对使用声明 X::f2 有异议。然而,这与“X”的歧义无关(如 gcc 和 Comeau 的情况)。它是关于“错误 C2876:'X':并非所有重载都可以访问”。
编辑3:
struct X{
void f(){}
};
struct Y : X{
struct trouble{
void f(){}
};
};
struct trouble : X{
};
struct letscheck : Y, trouble{
using trouble::f;
};
int main(){}
在这里,我尝试(有目的地)在 using 声明中创建类型问题。Gcc 仍然可以很好地编译,VS2010 也是如此。Comeau 仍然给出关于模棱两可类型“麻烦”的错误(如预期的那样)。根据对初始查询的解释,看来 GCC 和 VS2010 是错误的。那是对的吗?