mehrdeutige Vorlage Seltsamkeit

8

Ich habe den folgenden Code (Entschuldigung für den großen Code-Chunk, aber ich konnte ihn nicht mehr eingrenzen)

%Vor%

Aber es kann nicht mit gcc (v4.3) mit

kompiliert werden %Vor%

OK, also ist es mehrdeutig. aber ich habe nicht erwartet, dass es ein Problem ist, da es bei der Spezialisierung fast immer eine Zweideutigkeit geben wird. Dieser Fehler wird jedoch nur ausgelöst, wenn die Klasse mit enable_if<...> verwendet wird. Wenn ich sie durch eine Klasse wie die folgende ersetzen kann, gibt es kein Problem.

%Vor%

Warum verursacht diese Klasse keine Zweideutigkeit, während die anderen dies tun? Sind die beiden nicht dasselbe für Klassen mit einem wahren :: Wert? Wie auch immer, irgendwelche Hinweise darauf, was ich falsch mache, werden geschätzt.

Danke für die Antworten , mein wirkliches Problem (um den Compiler zur Auswahl meiner ersten Spezialisierung zu bringen) wurde gelöst, indem struct Foo<X, Base<X>, void> durch struct Foo<X, Base<X>, typename enable_if< Base<X> >::type > ersetzt wurde, was so funktioniert, wie ich es möchte.

    
keis 22.07.2009, 17:17
quelle

3 Antworten

12

Der Kern Ihrer Frage ist, dass Sie haben:

%Vor%

und Sie versuchen, es mit

abzugleichen %Vor%

Offensichtlich stimmen beide Spezialisierungen überein (die erste mit X = int , die zweite mit X = int, Y = Base<int> ).

Gemäß dem Standard, Abschnitt 14.5.4, wird, wenn es mehr übereinstimmende Spezialisierungen gibt, eine partielle Ordnung (wie in 14.5.5.2 definiert) unter ihnen konstruiert und die am meisten spezialisierte wird verwendet. In Ihrem Fall ist keiner jedoch spezialisierter als der andere. (Einfach gesagt, eine Vorlage ist spezialisierter als eine andere, wenn Sie jeden Typparameter der letzteren Vorlage durch einen Typ ersetzen können und im Ergebnis die Signatur der ersten erhalten. Wenn Sie whatever<Y>::type haben und Sie Y ersetzen Mit Base<X> erhalten Sie whatever<Base<X> >::type nicht void , dh es wird keine Verarbeitung durchgeführt.)

Wenn Sie #2 durch

ersetzen %Vor%

dann enthält der Kandidatensatz wieder beide Vorlagen, jedoch ist # 1 spezialisierter als # 3 und als solcher ausgewählt.

    
avakar 22.07.2009, 19:31
quelle
-1

vermissen Sie nicht ein

%Vor%

Symbol?

    
nairdaen 22.07.2009 17:20
quelle
-2

Ich glaube, du verpasst ein '& lt;', eine Vorlage sollte wie folgt aussehen:

%Vor%     
DeusAduro 22.07.2009 17:22
quelle

Tags und Links