2012-04-06 15 views
1

In einem Projekt, an dem ich arbeite, bin ich dabei, einen Vektor mit Zeigern zu einer Vorlagenklasse zu erstellen.C++ std :: Vektor mit Zeigern zu einer Vorlagenklasse

template <typename T> 
std::vector<templateClass<T>*> vec; 

aber das gibt mir zwei Fehler:

Error C2133: vec : unknown size 
Error C2998: std::vector<templateClass<T>*> vec : cannot be a template definition 

Wenn ich den Code ändern zu:

std::vector<templateClass<int>*> vec; 

Es funktioniert gut, so dass ich denke, das Problem ist nicht, dass Sie Ich kann keine Template-Klassen mit Vektoren verwenden, aber Sie müssen dem Compiler mitteilen, welcher Typ verwendet werden soll. Gibt es einen Weg dazu?

+1

Ist das ein Klassenmitglied oder Sie versuchen, eine Variable mit Vorlage zu deklarieren? –

+1

Sie müssen den Kontext angeben, in dem vec deklariert ist - ist es ein Klassenmitglied oder ein Stapelobjekt? –

+0

Sind Sie sicher, dass Sie nicht einfach einen Typedef verpassen? –

Antwort

2

Wenn Sie eine Klasseninstanz erstellen, müssen Sie den Typ auswählen. In der Definition können Sie T schreiben, aber zum Zeitpunkt der Erstellung der Instanz müssen Sie den Typ angeben.

Wenn Sie also eine Instanz definieren und nicht erstellen möchten, verwenden Sie typedef.

1

Sie können kein Vorlagenmitglied haben.
Die Vorlage muss aus der deklarierten Klasse oder Funktion stammen.

template <typename T> 
class blah { 
    std::vector<templateClass<T>*> vec; 
} 

Der Compiler benötigt das Templat-Typname im Code definiert irgendwo werden, zum Beispiel: blah<int>

Wenn Sie ein Templat-Mitglied haben würde, Sie nicht den Typ irgendwo im Code definieren könnte, und der Compiler wäre nicht in der Lage, den Typ des Mitglieds zu bestimmen.

Der typisierte Vorlagenname wird festgelegt, wenn Sie die Funktion oder Klasse (explizit oder implizit) zum ersten Mal verwenden, sodass Sie die Vorlagedefinition und Implementierung irgendwo haben müssen, auf die der aufrufende Code zugreifen kann.

1

Es sieht so aus, als ob Sie versuchen, einen neuen Typ vec<T> als Abkürzung für den längeren templatetisierten Ausdruck zu definieren. Normalerweise würde dies mit einem typedef durchgeführt werden, jedoch unterstützt C++ keine templatetisierten Typedefs.

Beachten Sie, dass Sie im aktuellen Code im Wesentlichen versuchen, eine Variable namens vec zu definieren, aber Sie geben es nicht einen bestimmten Typ für T und das ist der Grund, warum der Compiler beschweren.

1

Derzeit C++ nicht Vorlage typedefs unterstützen, so dass Sie die gängigste Lösung verwenden, vorgeschlagen von Herb Sutter (http://gotw.ca/gotw/079.htm)

+0

C++ 11 wurde vor einigen Monaten ratifiziert und enthält Template-Typedefs (sie heißen Template-Aliase). Allerdings ist [ihre Unterstützung] (http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) in Compilern noch nicht sehr verbreitet. –

+0

Davon abgesehen denke ich, dass das nicht das ist, wonach das OP sucht. Wenn ich richtig verstanden habe, denke ich, dass sein Vektor heterogene Elemente enthalten soll: 'templateClass *', 'templateClass *', usw. Dies ist jedoch nur eine Vermutung. –

Verwandte Themen