Problem mit Templates
-
Hallo,
ich hab hier folgende Klasse für Arrays geschrieben:
template<class ItemClass> class CUnsafeArray { public: //public methods protected: //protected methods public: //public data protected: //protected data }; template<class ItemClass> class CSafeArray : CUnsafeArray<ItemClass> { };So und jetzt möchte ich, dass wenn _DEBUG oder XXT_ONLY_SAFE_ARRAYS definiert ist, dass dann die Klasse CArray immer die Klasse CSafeArray ist,
ansonsten sollte CArray die Klasse CUnsafeArray sein://Now choose what CArray should be, safe or unsafe #if defined(_DEBUG) || defined(XXT_ONLY_SAFE_ARRAYS) #define CArray CSafeArray; #else #define CArray CUnsafeArray; #endifDas klappt jetzt leider nicht, bei
CArray < int > test_array;gibts diese Fehlermeldung
'XenesisXT::CSafeArray' : use of class template requires template argument list
syntax error : missing ';' before '<'Wenn ich dagegen CSafeArray statt CArray schreibe gehts

Hat jemand ne Idee wie ich das realisieren könnte?
-
Nuja, mach doch mal die ";" hinter dem define weg

-
Ich weiß nicht, was das Problem ist (ich vermute mal, eine fehlende Namensbereichs-Angabe) aber Makros halte ich hier für die falsche Lösung. Ich würde das über eine Metafunktion machen:
template <typename T> struct CArray { #if defined(_DEBUG) || defined(XXT_ONLY_SAFE_ARRAYS) typedef CSafeArray<T> result; #else typedef CUnsafeArray<T> result; #endif }; // und Instanzierung: CArray<int>::result test_array;PS: Wozu das Präfix 'C'? Dass es sich um Klassen handelt, sollte irrelevant sein und ist außerdem gelogen ('CArray' ist bei Dir kein Typ sondern ein Makro).
/EDIT: Reihenfolge vertauscht ...
-
Jop, stimmt, das böse ; wars

@Konrad Rudolph: Naja, die Lösung is ja auch nicht gerade intuitiv.
Ich würds ja sehr gerne mit typdef machen (hab ich auch zuerst versucht, deswegen stand da auch ein ; ), aber wenn's nicht geht...
-
XCooperation schrieb:
@Konrad Rudolph: Naja, die Lösung is ja auch nicht gerade intuitiv.
Nein, intuitiv nicht unbedingt. Aber sie ist inzwischen in einigen Kreisen bereits ein Idiom, d.h. jeder, der in ihren Sinn "eingeweiht" ist, erkennt das Konstrukt sofort. In der Spirit- und der Loki-Bibliothek werden solche Dinger am laufenden Band verwendet.