Разрешение перегрузки/неоднозначность в поиске имени (какой)

StackOverflow https://stackoverflow.com/questions/4130201

Вопрос

$ 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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top