Funktion Template Spezialisierung
-
Wo sollte man ein Funktion Template spezialisieren? Wenn ich es im Header mache,bekomme ich Linkerfehler:
error: multiple definition of getSize<Triangle>(Triangle const&) ... Noch mehr solcher Fehler ....
Wenn ich es in der .cpp mache, bekomme ich einen Compilererror, da der Compiler die Spezialation nicht findet und ich als "default" ein static_assert(sizeof(T) == 0, "Error: ...."); habe:
Fehler: statische Behauptung gescheitert: "Error: Not implemented for this type.
-
Zeig doch mal deine Funktion.
(Include-Guards im Header gesetzt?)
-
template <class Object> double getSize (const Object &o) { static_assert(sizeof(Object) == 0, "Error: Not implemented for this type."); } // Spezialisierung template <> double getSize<Triangle>(const Triangle &t) { return 0.5 * getLength(cross(t.a, t.b) ); }
Habe nur eine Spezialisierung angegeben, sind noch mehr, ist aber denke ich uninterresant.
-
Sollte funktionieren, ich tippe immer noch auf Include-Guards?
-
Ich denke ich habe das Problem gefunden. Einmal habe ich eine Library, die die Funktion benutzt. Und dann habe ich noch ein Testprogram, das den Header included UND gegen die Lib gelinkt wird. Wie mach ich das richtig?
-
Eine explizite Spezialisierung eines Funktionstemplates ist eine Funktion.
Die Definition einer solchen Spezialisierung ist folglich die Definition einer Funktion.
Die ODR besagt, dass (benutzte) nicht-inline Funktionen genau einmal im Programm definiert werden müssen. Wird die Definition also im Header ausgeführt, wird es zu Mehrfachdefinitionen kommen. Die Lösung ist also entweder:
- Definition als inline-Funktion
- Nur Deklaration der Spezialisierung im Header+Definition in einer einzelnen Übersetzungseinheit
-
Danke, das mit dem inline hat geholfen. Ich dachte Templates sind automatisch inline? Aber das ist dann wohl bei der Spezialisierung anders.