Разрешение перегрузки / неоднозначность в поиске имени (какой) - PullRequest
4 голосов
/ 09 ноября 2010

$ 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, я чувствую, что комментарий во фрагменте кода не совсем корректен.Ошибка действительно в первую очередь связана с неоднозначностью базового класса «А», а не с чем-либо еще (например, неоднозначность в разрешении перегрузки).Какие-нибудь мысли?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Это вызвано поворотом при поиске имени в C ++ 03: проверка однозначного подобъекта была частью поиска имени члена класса в C ++ 03. Поиск в C ++ 03 найдет D :: X и C :: x и A :: x, где A :: x совпадает, но связан с двумя различными подобъектами типа A.

В C ++ 0x проверка однозначного подобъекта теперь является частью соответствующих подпунктов, см. DR # 39 : класс, в котором x является прямым членом, является неоднозначной базой поэтому пункт 5 вызовет ошибку компиляции вместо пункта 10.

Обратите внимание, что в комментарии говорится о подобъектах A. Существует один подобъект A, который проходит по пути B, и другой подобъект A, который проходит по пути C. Вот почему в комментарии говорится "B::x или C::x". Присутствие нескольких подобъектов одного и того же типа класса можно определить, просто пытаясь преобразовать его в тип класса, игнорируя проблемы доступности: если преобразование неоднозначно, подобъект появлялся несколько раз.

0 голосов
/ 09 ноября 2010

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...