Mehrdeutige Definition von operator () mit mehrfacher Vererbung

8

Ich kompiliere diesen Code mit GCC (4.2.1 Apple Build 5664)

%Vor%

und gib mir den folgenden Fehler:

%Vor%

Ich verstehe nicht den Grund, warum dieser Code mehrdeutig ist; Die beiden Methoden haben unterschiedliche Signaturen.

    
mattia.penati 28.01.2011, 18:30
quelle

3 Antworten

6

Ändern Sie c auf diese Weise:

%Vor%

C ++ (vor C ++ 0x) ist bei der Vererbung von Funktionen ziemlich umständlich: Wenn Sie eine Funktion mit dem gleichen Namen einer Basisklassenfunktion angeben, werden die Basisklassenfunktionen ausgeblendet.

Es sieht so aus, als ob auch das Erben von zwei Klassen das gleiche Problem hat.

// Suche nach dem Standard ...

    
peoro 28.01.2011, 18:45
quelle
6

Die Namensauflösung erfolgt vor der Überladungsauflösung.
Es gibt keine operator() in c , also sucht der Compiler nach operator() in seinen Basisklassen und findet eine in a und eine andere in b , wodurch der Name mehrdeutig wird (und keine Überladungsauflösung stattfindet).

Wenn Sie die Mehrdeutigkeit des Namens eliminieren möchten, können Sie a::operator() explizit aufrufen: vc.a::operator()(1);

    
Eugen Constantin Dinca 28.01.2011 19:18
quelle
1

Es ist mehrdeutig, weil Sie eine Integer-Konstante übergeben, die (vermutlich) entweder in std::size_t oder index types umgewandelt werden kann. Ändern Sie main in das folgende und es sollte es auflösen:

%Vor%

Es ist sehr wahrscheinlich, dass Sie hier keine Mehrfachvererbung verwenden sollten.

    
Zac Howland 28.01.2011 18:37
quelle