Warum sollte ich konvertieren?

8

In diesem Code:

%Vor%

Ich erhalte einen Fehler:
_Error 1 Fehler C2446: ':': keine Konvertierung von 'RightSide *' zu 'LeftSide *' _

Ich habe (zu Unrecht, wie ich sehe) gedacht, dass ich den Zeiger ohne Probleme von abgeleitet auf basis zuweisen kann. Wo ist das Problem?

    
There is nothing we can do 30.09.2010, 18:39
quelle

4 Antworten

15

Das Problem liegt nicht bei der Konvertierung von LeftSide oder RightSide nach Side<T> . Wie Sie ursprünglich dachten, wäre diese Umwandlung in Ordnung.

Das Problem liegt vielmehr bei diesem Ausdruck:

%Vor%

Lasst uns das ein bisschen auflösen. Der ternäre Operator (im Standard richtig als "Vergleichsoperator" bezeichnet) sieht folgendermaßen aus:

%Vor% Denken Sie daran, dass dieses ganze Konstrukt selbst ein Ausdruck ist. Das heißt, es gibt einen Wert zurück, der einen Typ haben muss, obv. Der Typ des ganzen Ausdrucks wird aus den Typen lhs_expression und rhs_expression abgeleitet. In diesem Fall haben Sie eine LeftSide und eine RightSide . Also, hier ist dein Problem.

LeftSide und RightSide sind nicht direkt miteinander verwandt, außer dass sie eine gemeinsame Basisklasse haben, und zwischen ihnen ist keine Konvertierung verfügbar. (Sie müssten einen schreiben.) Es gibt also keinen einzigen Datentyp, den bool_val ? lhs_expression : rhs_expression haben könnte. Du könntest denken: "Nun, dummer Compiler, warum nicht einfach die gemeinsame Basisklasse herausfinden und verwenden?" Das ist in der Tat ein bisschen Schmerz. Wenn man das Argument, dass es richtig oder falsch ist, beiseite lässt, funktioniert das einfach nicht so.

Sie haben zwei Möglichkeiten.

Eins, benutze ein einfacheres Konstrukt:

%Vor%

Zweitens: Wenn Sie wirklich den ternären Operator verwenden möchten (was manchmal der Fall ist), müssen Sie den Compiler mit seinen Datentypen typisieren:

%Vor%     
John Dibling 30.09.2010, 19:10
quelle
4

Ich denke, dass das? : operator erfordert, dass die beiden Optionen vom selben Typ sind; nicht, dass sie in den gleichen Typ konvertiert werden können

FYI gcc schlägt fehl

%Vor%

funktioniert sowohl für Side (int) * als auch (das wusstest du wahrscheinlich schon)

    
pm100 30.09.2010 18:42
quelle
2

Sie möchten, dass beide Zweige ein Side<int>* zurückgeben, aber der Compiler weiß das nicht, der Typ Side<int> erscheint nirgendwo in diesem Ausdruck.

Da ich keinen Cast verwenden möchte, wenn eine implizite Konvertierung existiert, würde ich folgendes schreiben:

%Vor%

Aber wenn Sie einen ternären Operator verwenden möchten,

%Vor%

Nun ist der rechte Zweig vom Typ Side<int>* , die linke Hand ist in diesen Typ konvertierbar, alles ist in Ordnung (und der Compiler optimiert die zusätzliche Variable).

    
Ben Voigt 30.09.2010 18:43
quelle
0

Die beiden sollten vom selben Typ sein, oder einer sollte in den anderen konvertierbar sein.

%Vor%     
SoapBox 30.09.2010 18:48
quelle

Tags und Links