PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : std::vector mit Template



dnb
29-04-2009, 16:35
Hallo,
nach langer Abwesenheit habe ich mal wieder eine Frage zu einem Problem bei dem ich nicht weiterkomme. Ob der zusammengekürzte Quellcode so sinnvoll ist glaube ich nicht, aber es geht mir eher darum, wie ich in dem Fall ein std::vector mit Template benutzen kann.

Der folgende Quellcode gibt die folgende Fehlermeldung beim Linken:

In function `Datasets::iterator()': undefined reference to `Iterator<Data>::Iterator(std::vector<Data, std::allocator<Data> >&)'.



template<class T>
class Iterator {
public:
Iterator<T>( std::vector<T>& data );

private:
std::vector<T>& _data;
};

template<class T>
Iterator<T>::Iterator( std::vector<T>& data )
: _data( data ) {
}

// _datasets = std::vector<Data>
std::auto_ptr< Iterator<Data> > Datasets::iterator() {
return std::auto_ptr< Iterator<Data> >( new Iterator<Data>( _datasets ) );
}



Ich hoffe es kann jemand damit etwas anfangen und mir bei meinem Problem weiterhelfen ...

MfG =>dnb<=

BLUESCREEN3D
29-04-2009, 17:29
Iterator<T>( std::vector<T>& data );
Hier kannst du das erste <T> weglassen.

Eig. müsste es funktionieren - wie kompilierst du das denn (und was liegt in welcher Datei)?

dnb
30-04-2009, 09:01
Stimmt, das erste <T> hatte ich auch weggelassen, ist aber irgendwie reingerutscht.
Die Iterator-Klassendefinierung liegt in Iterator.hpp, die Iterator-Implementierung in Iterator.cpp, der Konstruktor-Aufruf z.B. in der main.

Bin dem Problem auch etwas näher gekommen. Wenn ich den c'tor in der Headerdatei implementiere geht es...
Eine Lösung ist es, aber wodurch wird der Fehler genau verursacht? An einer fehlenden Iterator-Objektdatei liegt es nicht, die wird mitgelinkt.

template<class T>
class Iterator {
public:
Iterator( std::vector<T>& data )
: _data( data ) {}
private:
std::vector<T>& _data;
};

Fabeltier
27-05-2009, 12:40
Hallo,

Hast Du also Header und Implementationsdatei getrennt? Afaik geht das immer noch nicht in C++ wenn Du Templates verwenden willst!
http://www.c-plusplus.de/forum/viewtopic-var-t-is-39467.html

Ansonsten zwei Anmerkungen, ist die Referenz hier gewollt?

std::vector<T>& _data;
...und dann erinnere mich noch an eine Sache keine Smartpointer zusammen mit STL Containern zu verwenden. Bzw diese nicht den Smartpointern als Template Type zu uebergeben.