$ 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 :: х или C :: х указывают на тот факт, что А является неоднозначным база D
prog.cpp: In function ‘int f(D*)’: prog.cpp:16: error: ‘A’ is an ambiguous base of ‘D’
И
"ComeauTest.c", line 21: error: base class "A" is ambiguous return d->x(); // ambiguous: B::x or C::x
Переход по правилам поиска имен в $ 10.2 , Я чувствую, что комментарий в фрагменте кода не совсем правильный. Ошибка действительно в первую очередь связана с двусмысленностью базового класса «А», а не с чем-либо еще (например, двусмысленность в разрешении перегрузки). Есть предположения?
Интересно, что Visual C++ 10.0 компилирует выше, выбирая подобъект A в B ... Я мог бы это понять, если он выбрал подобъект A в C. Кажется, что g ++ и Comeau сначала разрешают функцию-член как A :: x(), а затем обнаруживают, что d-> A :: x() неоднозначно. Но, что интересно, Visual C++ 10.0 компилирует даже это! –
@Alf P. Steinbach: Да. Это было удивительно и для меня – Chubsdad
Поскольку у меня нет компилятора C++ 03, я надеюсь, что этот вопрос будет терпеть ... Как насчет использования виртуального ключевого слова, как в struct D: virtual B, C или struct D: виртуальный C, виртуальный B? – JimR