Fehler "Ungültiges Vorlagenargument" in Visual Studio, aber nicht in GCC

8

Angenommen, Sie haben den Code

%Vor%

Child und NotWorkingChild unterscheiden sich nur durch den typedef. In GCC kompilieren beide in Visual Studio den Konstruktor von NotWorkingChild den folgenden Fehler:

%Vor%

Können Sie erklären, warum das so ist? Gibt es eine bessere portable Lösung als die Typedef?

Danke!

    
Philipp 15.03.2011, 16:55
quelle

2 Antworten

11

Die Fehlermeldung ist, weil NotWorkingChild (indirekt) von SCEST<int> abgeleitet wird, was SCEST im Bereich von NotWorkingChild auf die Klasse SCEST<int> anstatt auf die Vorlage verweist. MSVC ist korrekt, dies abzulehnen, und GCC4.5 sollte dies auch ablehnen (GCC4.5 hat eine korrektere Suche nach Klassennamen).

Hier ist eine Lösung, die für beide Compiler funktionieren könnte

%Vor%

Beachten Sie, dass wir den Operator für die Bereichsauflösung verwenden und ein Leerzeichen vor :: setzen müssen (das Token <: wird andernfalls als Digraph verwendet).

Aktuelle Nachrichten : C ++ 0x wird die oben genannten Aufgaben erledigen, selbst wenn Sie EST16<SCEST> ausführen. Der Grund ist, dass es besagt, dass wenn der Name der injizierten Klasse an einen Template-Template-Parameter übergeben wird, der Name der injizierten Klasse als Vorlage und nicht als Typ behandelt wird. Daher wäre GCC für C ++ 0x der Compiler, der es richtig macht.

    
Johannes Schaub - litb 16.03.2011, 22:48
quelle
2

Es wird auf VS kompiliert, wenn Sie den Initialisierer so ändern, dass er nur auf den Namen der Vorlagenklasse, EST16, verweist. I.e .:

%Vor%     
jon-hanson 15.03.2011 17:33
quelle

Tags und Links