#include <iostream>
struct A {
void test() { std::cout << "A\n"; }
};
struct B : A {
void test() { std::cout << "B\n"; }
};
struct C : B {
using A::test;
using B::test;
};
int main() {
C().test(); // Is this ambiguous?
return 0;
}
在此示例中,g ++ 8.1.0成功编译并从test()
调用B
。
clang ++ 3.8.0报告:error: call to member function 'test' is ambiguous
。
哪个是对的?如果是g ++,那么选择B::test
而不是A::test
的规则是什么?
答案 0 :(得分:1)
我相信Clang是对的。 根据{{3}}:
由于 using-declaration 是一个声明,因此对同一声明区域([basic.scope])中同名声明的限制也适用于 using-declarations
由于您无法声明两个相同的成员函数,因此同样适用于using
声明。
答案 1 :(得分:0)
GCC让它编译,test()
调用成为第一个声明。在给出的示例中,它会调用A::test()
。但ISO C ++将其定义为含糊不清。 Visual Studio和clang不允许你编译它。此外,这是VS错误消息:'B::test': ambiguous call to overloaded function
。在我看来,GCC让它编译是错误的。