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?

È stato utile?

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top