template spezialisierung ausserhalb des namespaces?
-
also, ich hab eine klasse, die in etwa so aussieht:
namespace test{ template<class T> struct Property{ enum{Value=0}; } }
nun soll diese Klasse für jede Klasse die einen anderen Wert bei Value haben soll spezialisiert werden, zb so:
struct A{}; template<> Property<A>{ enum{Value=1}; };
gibts ne möglichkeit, die spezialisierungen ausserhalb des namespaces zu platzieren? wäre dumm, wenn der user immer den namespace test öffnen müsste, um diese "fleißarbeit" zu erledigen, und die struct würde ich nur sehr ungern aus dem namespace selber entfernen...
-
[cpp]template<>
struct **test::**Property<A>
{
enum{Value=1};
};[/cpp]naja...
Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1 Copyright 1988-2003 Comeau Computing. All rights reserved. MODE:strict errors C++ "ComeauTest.c", line 13: error: the initial explicit specialization of class "test::Property<A>" [b]must be declared in the namespace containing the template[/b] struct Property<A>{ ^
-
@ssm
Nur weil der Comeau sagt, dass es ein Fehler ist, heisst das noch lang nicht, dass auch der Standard von einem Fehler spricht (auch wenn die Chance sehr gross ist).
@otze
Fakt ist, wenn du eine explizite Spezialisierung, wie in deinem Fall, hast, dann musst die in dem Namespace stehen, wie die eigentliche Template Klasse (14.7.3-2). Also, entweder der User muss den Namensraum "manuell" öffnen oder du überdenkst noch einmal dein Design. Vielleicht könnte Value ja auch ein Template Argument mit Defaultwert sein.
-
Vielleicht könnte Value ja auch ein Template Argument mit Defaultwert
a) es war grad das ziel dieser aktion, zusätzliche template parameter RAUS zu bekommen
es geht um das leidliche problem, wie ein user in einer TMP librarie eigene "funktionen" und Klassen einfügen kann, ohne ihn a) zu sehr zu binden, und b) ohne sicherheiten zu verlieren.
das aber jetzt auszuführen würde zuweit gehen.naja danke, werd ich die 3 klassen ausserhalb des namespaces ansiedeln, ist auch kein alzugroßer verlust...