Ich versuche, Spezialisierungen zusammen zu gruppieren, um zu vermeiden, sie mehrmals zu schreiben. Zum Beispiel versuche ich im folgenden Code "float" und "double" als einen Fall der Implementierung für foo :: func() zu spezialisieren; Ich verwende dann eine andere Implementierung für "bool".Warum zählt dieser abhängige Typ nicht als Spezialisierung mit dem Template-Argument?
template<typename T> struct foo;
template<typename T> struct bar;
template<> struct bar<float> { typedef float Type; };
template<> struct bar<double> { typedef double Type; };
/* specialize for float and double here */
template<typename T> struct foo<typename bar<T>::Type> {
static void func() { ... }
};
template<> struct foo<bool> {
static void func() { ... }
};
Diese Fehler in GCC 4.4.3. (Dies ist ein Ziel Compiler, weil es für Ubuntu Server 10.04 LTS Lager ist, die drei Jahre angeblich zu leben hat.) Der Fehler ist:
foo.cpp:8: error: template parameters not used in partial specialization:
foo.cpp:8: error: ‘T’
Der Fehler bezieht sich auf die erste Spezialisierung von foo (für " float "und" double. ")
Ich sehe nicht, welchen Teil von C++ ich hier verletze - wenn jemand das Kapitel und den Vers kennt, würde ich es begrüßen. Wenn jemand einen anderen Weg kennt, um dasselbe Ziel zu erreichen (Wiederverwendung von Spezialisierungen für bestimmte Gruppen von Typen, ohne unnötigen ausführlichen Code), würde ich mich über Vorschläge freuen!
Ich wäre sehr glücklich, einen "mehrdeutigen Template-Spezifikation" -Fehler zu bekommen, wenn es mehrere Bars mit der gleichen Type-Deklaration gibt. Der Compiler verfügt tatsächlich über alle erforderlichen Informationen. Seltsamerweise berichtet ein Freund, dass diese Erklärung auf GCC 4.1 auf MacOS X funktioniert. Wie auch immer - danke für die Antwort und die vorgeschlagene Lösung. Es sieht so aus, als könnte das für mich funktionieren! –