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.
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.
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
dann enthält der Kandidatensatz wieder beide Vorlagen, jedoch ist # 1 spezialisierter als # 3 und als solcher ausgewählt.
Tags und Links c++ gcc templates specialization