Gegeben eine Vorlagenklasse als solche:
template <typename TYPE>
class SomeClass {
public:
typedef boost::intrusive_ptr<SomeClass<TYPE> > Client_t;
inline Client_t GetClient() { return Client_t(this); }
};
SomeClass soll nur über Zeigerreferenzen verwendet werden, die von SomeClass::GetClient() zurückgegeben werden. Daher ist es naheliegend, eine Wrapper-Funktion um die Erstellung herum zu schreiben, wie diese:
template <typename TYPE>
SomeClass<TYPE>::Client_t New_SomeClass() {
return (new SomeClass<TYPE>)->GetClient();
}
Kompilieren des obigen Codes unter GCC 4.4:
SomeClass<int>::Client_t some_class = New_SomeClass();
Gibt den Fehler "'New_SomeClass' wurde nicht in diesem Bereich deklariert".
Jetzt bin ich kein Template-Assistent, so könnte es Details hier, die ich nicht bewusst sind, aber ich vermute, ich kann nicht ein Konstrukt dieser Art überhaupt aufgrund der Tatsache, dass C++ nicht Überladen auf Rückgabetyp erlaubt verwenden.
Ich schätze, ein... Zittern ... Makro würde das Problem lösen:
#define NEW_SOMECLASS(TYPE) ((new SomeClass<TYPE>)->GetClient())
auto some_class = NEW_SOMECLASS(int);
Aber es muss doch einen vernünftigen Weg geben, die Objekterzeugung einer Template-Klasse darzustellen, ohne auf Makros oder andere umständliche Konstrukte zurückzugreifen?