Разрешение перегрузки / неоднозначность в поиске имени (какой)
7,3,3 / 14 (C ++ 03)
struct A { int x(); };
struct B : A { };
struct C : A {
using A::x;
int x(int);
};
struct D : B, C {
using C::x;
int x(double);
};
int f(D* d) {
return d->x(); // ambiguous: B::x or C::x
}
Комментарий в коде в 'f' указывает на то, что можно ожидать двусмысленности между 'B :: x' или 'C :: x'.
Однако при компиляции с g ++ (ideone) или Comeau ошибки немного отличаются. Эти ошибки вместо указания неоднозначности в B :: x или C :: x указывают на тот факт, что A является неоднозначным основанием D
prog.cpp: в функции «int f (D *)»: prog.cpp: 16: ошибка: «A» является неоднозначным основанием «D»
А также
"ComeauTest.c", строка 21: ошибка: базовый класс "A" неоднозначен return d-> x (); // неоднозначно: B :: x или C :: x
Следуя правилам поиска имен в $ 10.2, я чувствую, что комментарий во фрагменте кода не совсем корректен. Ошибка действительно в первую очередь связана с неоднозначностью базового класса «А», а не с чем-либо еще (например, неоднозначность в разрешении перегрузки). Какие-нибудь мысли?