Sobrecarga de resolução / ambiguidade na pesquisa de nome (qual)
$ 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
}
O comentário no código em 'f' indica que se pode esperar ambiguidade entre 'B :: x' ou 'C :: x'.
No entanto, ao compilar com g ++ (ideone) ou Comeau, os erros são ligeiramente diferentes. Esses erros, em vez de indicar ambiguidade em B :: x ou C :: x indicam o fato de que A é uma base ambígua de D
prog.cpp: na função 'int f (D *)': prog.cpp: 16: erro: 'A' é uma base ambígua de 'D'
E
"ComeauTest.c", linha 21: erro: classe base "A" é retorno ambíguo d-> x (); // ambíguo: B :: x ou C :: x
Seguindo as regras de pesquisa de nome em US $ 10,2, sinto que o comentário no snippet de código não está realmente correto. De fato, o erro está principalmente relacionado à ambiguidade da classe base 'A' e não a qualquer outra coisa (por exemplo, ambiguidade na resolução de sobrecarga). Alguma ideia?