Разрешение перегрузки/неоднозначность в поиске имени (какой)
-
29-09-2019 - |
Вопрос
$ 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"-неоднозначный возврат d-> x (); // неоднозначно: b :: x или c :: x
Пройдя по правилам поиска имени за $ 10,2, я чувствую, что комментарий в фрагменте кода не совсем верен. Ошибка действительно в первую очередь связана с двусмысленностью базового класса «А», а не чем -то еще (например, неоднозначность в разрешении перегрузки). есть идеи?
Решение
Это вызвано поворотом в названии в C ++ 03: проверка однозначного субобекта была частью поиска имени члена класса в C ++ 03. Поиск в C ++ 03 найдет d :: x и c :: x и a :: x, где A :: x соответствует, но связано с двумя различными субобъектами типа A.
В C ++ 0x проверка однозначного субобекта теперь является частью соответствующих подкладов, см. Доктор #39: Класс, где x
непосредственно членом является неоднозначной базой, поэтому пункт 5 приведет к ошибке компиляции вместо пункта 10.
Обратите внимание, что в комментарии рассказывается о субобъектах A
. Анкет Есть один подзадачный A
это идет по пути B
, и еще один субобект A
это идет по пути C
. Анкет Вот почему в комментарии говорится "B::x
или C::x
«Наличие нескольких субобъектов одного типа класса можно определить, просто пытаясь преобразовать в тип класса, игнорируя проблемы с доступностью: если преобразование неоднозначно, субобект появлялся несколько раз.
Другие советы
Clang ++ дает в некоторой степени комбинацию ошибок, произведенных G ++ и Comeau
C:\Users\SUPER USER\Desktop>clang++ chubsdad.cpp
chubsdad.cpp(12) : error: ambiguous conversion from derived class 'D' to base class
'A':
struct D -> struct B -> struct A
struct D -> struct C -> struct A
return d->x(); // ambiguous: B::x or C::x
^
1 error generated.