Ich habe den folgenden Code (sorry für den großen Code Brocken, aber ich konnte es nicht mehr einengen)mehrdeutig Vorlage Seltsamkeit
template <bool B>
struct enable_if_c {
typedef void type;
};
template <>
struct enable_if_c<false> {};
template <class Cond>
struct enable_if : public enable_if_c<Cond::value> {};
template <typename X>
struct Base { enum { value = 1 }; };
template <typename X, typename Y=Base<X>, typename Z=void>
struct Foo;
template <typename X>
struct Foo<X, Base<X>, void> { enum { value = 0 }; };
template <typename X, typename Y>
struct Foo<X, Y, typename enable_if<Y>::type > { enum { value = 1 }; };
int main(int, char**) {
Foo<int> foo;
}
aber es funktioniert nicht mit gcc (v4.3) mit
kompilierenfoo.cc: In function ‘int main(int, char**)’:
foo.cc:33: error: ambiguous class template instantiation for ‘struct Foo<int, Base<int>, void>’
foo.cc:24: error: candidates are: struct Foo<X, Base<X>, void>
foo.cc:27: error: struct Foo<X, Y, typename enable_if<Y>::type>
foo.cc:33: error: aggregate ‘Foo<int, Base<int>, void> foo’ has incomplete type and cannot be defined
OK, so 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 ersetze, gibt es kein Problem.
template <typename X, typename Y>
struct Foo<X, Y, void > { enum { value = 2 }; };
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 eigentliches Problem (der Compiler, um meine erste Spezialisierung wählen) wurde durch Ersetzen struct Foo<X, Base<X>, void>
mit struct Foo<X, Base<X>, typename enable_if< Base<X> >::type >
gelöst, die die Art, wie ich will zu arbeiten scheint.
Der Markdown-Editor ist nicht wysiwyg in Bezug auf
Ich reparierte es zuvor, überschrieb meine Änderungen :) Wenn Sie möchten, können Sie zu meiner Ausgabe zurückkehren (Ich habe die Schaltfläche "10101", die automatisch das Zeug als Code markiert, sollten Sie verwenden dieser Knopf auch). –
Uhjm ... Ich habe es wieder getan, ohne Ihren Kommentar zu lesen litb –