Sovraccarico Risoluzione / Ambiguità a nome di ricerca (quale)
-
29-09-2019 - |
Domanda
$ 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
}
Il commento nel codice in 'f' indica che ci si può aspettare ambiguità tra 'B :: x' o 'C :: x'.
Tuttavia, la compilazione con g ++ (Ideone) o Comeau gli errori sono leggermente differenti. Questi errori invece di indicare ambiguità in B :: x o C :: x indica il fatto che A è una base ambigua D
prog.cpp: In funzione ‘int f (D *)’: prog.cpp: 16: errore: ‘A’ è un Base ambiguo di ‘D’
E
"ComeauTest.c", linea 21: Errore: di base classe "A" è ambigua tornare d-> x (); // ambiguo: B :: x o C :: x
Andando dalle regole nome di ricerca a $ 10.2, ottengo una sensazione che il commento nel frammento di codice non è propriamente corretto. L'errore è infatti prima di tutto legata alla ambiguità della classe base 'A', piuttosto che qualsiasi altra cosa (per esempio l'ambiguità nella risoluzione di sovraccarico). qualche idea?
Soluzione
Questo è causato da una torsione in nome-ricerca in C ++ 03: Controllo di un sotto-oggetto inequivocabile era parte del nome membro della classe di ricerca in C ++ 03. Ricerca in C ++ 03 troveranno D :: X e C :: x e A :: x, dove A :: x partite, ma è associato a due sotto-oggetti distinti di tipo A.
In C ++ 0x, il controllo per un Subobject inequivocabile è ora parte delle rispettive sottoclausole, vedere DR # 39 :. La classe dove x
è direttamente un membro è una base ambigua - così clausola 5 causerà un errore di compilazione, invece di clausola 10
Nota che il commento parla delle sottoggetti di A
. C'è un sotto-oggetto di A
che va oltre percorso B
, e un altro sotto-oggetto di A
che va oltre percorso C
. Questo è il motivo per cui il commento dice "B::x
o C::x
". La presenza di più oggetti secondari dello stesso tipo di classe può essere determinata solo cercando di convertire al suo tipo di classe, ignorando i problemi di accessibilità: Se la conversione è ambiguo, il sotto-oggetto è apparso più volte.
Altri suggerimenti
Clang ++ dà piuttosto una combinazione degli errori prodotti da g ++ e 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.