2017-12-20 5 views
2

Ich möchte eine benutzerdefinierte Vektorklasse definieren, wie unten std :: vector Klasse mit benutzerdefinierten allocator verwendet:Vorlage typedef mit std :: vector haben benutzerdefinierte allocator

template <class T> 
typedef std::vector<T, MyLib::MyAlloc<T> > my_vector; 

Dann, als ich verwenden ttry es als:

my_vector<std::string> v; 

My g ++ 2.95.3 Compiler auf Solaris 10 beklagt die besagt, dass

template declaration of `typedef class vector<T,MyLib::MyAlloc<T1> > my_vector' 
aggregate `class my_vector<basic_string<char,string_char_traits<char>,__default_alloc_template<false,0> > > v' has incomplete type and cannot be initialized 

Bitte mir helfen t zu korrigieren er schnipsel.

+0

Ihr Fehler sagt '.... MyLib :: MyAlloc ', aber es gibt kein 'T1' im Code. Wenn das wirklich der Code und die Fehlermeldung ist, dann ist das ziemlich seltsam – user463035818

+0

@ tobi303 Ich bin auch verwirrt –

Antwort

2

C++ 11 unterstützt dies mit dem "neuen" Typ alias Syntax:

template <class T> 
using my_vector = std::vector<T, MyLib::MyAlloc<T> >; 

Die "alte" Form (typedef) nicht einen Alias ​​Vorlage erstellen verwendet werden.


Wenn C++ 11 oder höher ist keine Option. Der einzige Ausweg ist eine Vorlage Meta-Funktion:

template <class T> 
struct my_vector { 
    typedef std::vector<T, MyLib::MyAlloc<T> > type; 
}; 

, die wie folgt verwendet werden kann:

my_vector<std::string>::type v; 

Oder da std::vector ein Klassentyp ist:

template <class T> 
struct my_vector : std::vector<T, MyLib::MyAlloc<T> > {}; 

Welche sein kann so verwendet, wie Sie es ursprünglich gewünscht hatten.

+0

Hoppla, aber mein Compiler in diesem Fall ist vor C++ 11, es ist g ++ 2.95.3 –

+0

@ Dr.DebasishJana - Dann Der Alias ​​kann nicht direkt verwendet werden. Siehe meine Bearbeitung. – StoryTeller

+0

Ja, das ist ok für 2.95.3, aber für Memberfunktionen wie push_back usw. muss my_vector überschrieben werden? –

Verwandte Themen