alter hut: g++ - undefined reference to <function>
-
hallo,
tut mir leid, falls ich nicht gruendlich genug gesucht habe, aber ich habe einiges probiert, was google und die boardsuche zu dem thema ausgespuckt haben.
ich bin dabei, zu uebeungszwecken eine kleine vektorklasse zu schreiben und scheitere gerade peinlicher weise schon am ersten kompilieren ...
ausgabe:bash-3.2$ g++ -o test main.cpp sortedvector.cpp /tmp/ccJYUMJL.o: In function `main': main.cpp:(.text+0x81): undefined reference to `SortedVector<sTmp>::SortedVector()' main.cpp:(.text+0x126): undefined reference to `SortedVector<sTmp>::add(sTmp)' collect2: ld returned 1 exit status bash-3.2$ g++ -c main.cpp bash-3.2$ g++ -c sortedvector.cpp bash-3.2$ g++ main.o sortedvector.o -o test main.o: In function `main': main.cpp:(.text+0x81): undefined reference to `SortedVector<sTmp>::SortedVector()' main.cpp:(.text+0x126): undefined reference to `SortedVector<sTmp>::add(sTmp)' collect2: ld returned 1 exit status bash-3.2$
mein code:
sortedvector.h (nur wenig drin bis jetzt und davon nur ein teil implementiert):
template< class T > class SortedVector { public: SortedVector(); // const t at( const int pos ) const; // const T operator[]( const int pos ) const; // right-hand-side-operator // T& operator[]( const int pos ); // left-hand-side-operator bool add( const T t ); void removeAt( const int pos ); const int size() const; private: // void sort(); T *arr; int iSize; };
sortedvector.cpp:
#include "sortedvector.h" template < class T> SortedVector< T >::SortedVector() { iSize = 0; } template< class T > bool SortedVector< T >::add( const T t ) { T *tmpArray; if( iSize > 0 ) { tmpArray = new T[ iSize * sizeof( T ) ]; for( int i = 0; i < iSize; i++ ) tmpArray[ i ] = arr[ i ]; } iSize++; delete[] arr; arr = new T[ iSize * sizeof( T ) ]; if( iSize > 1 ) { for( int i = 0; i < iSize - 1; i++ ) arr[ i ] = tmpArray[ i ]; delete[] tmpArray; } arr[ iSize - 1 ] = t; } template< class T > void SortedVector< T >::removeAt( const int pos ) { if( pos >= iSize || pos < 0 || iSize == 0 ) return; if( iSize == 1 && pos == 0 ) { delete[] arr; return; } for( int i = 0; i < iSize; i++ ) if( i >= pos && i < iSize + 1 ) arr[ i ] = arr[ i + 1 ]; iSize--; T *tmpArr = new T[ iSize * sizeof( T ) ]; for( int i = 0; i < iSize; i++ ) tmpArr[ i ] = arr[ i ]; delete[] arr; arr = new T[ iSize * sizeof( T ) ]; for( int i = 0; i < iSize; i++ ) arr[ i ] = tmpArr[ i ]; delete[] tmpArr; } template< class T > const int SortedVector< T >::size() const { return reinterpret_cast< const int >( iSize ); }
main.cpp:
#include <string> #include <iostream> using namespace std; struct sTmp { int i; string s; }; #include "sortedvector.h" int main() { SortedVector< sTmp > svec; int iInput = 0; string sInput; while( iInput != 666 ) { cout << "int-value: "; cin >> iInput; cout << endl << "string-value: "; cin >> sInput; cout << endl; sTmp tmpS; tmpS.i = iInput; tmpS.s = sInput; svec.add( tmpS ); } return 0; }
sicher wieder ein ganz dummer fehler ...
vielen dank schonmal fuer jede hilfe.
mfg,
julian
-
Jap, ein Standard-Anfängerfehler
Aber nichts schlimmes: Templates müssen zur Compilezeit vollständig bekannt sein um instanziert werden zu können. Sprich, die Templates aus sortedvector.cpp müssen nach sortedvector.h. Am besten nimmst Du die .cpp aus dem g++-Aufruf raus und includest sie stattdessen in der .h.
-
danke LordJaxom, hat (natuerlich) geholfen.
die loesung sieht so aus:sortedvector.h:
template< class T > class SortedVector { public: SortedVector(); // const t at( const int pos ) const; // const T operator[]( const int pos ) const; // right-hand-side-operator // T& operator[]( const int pos ); // left-hand-side-operator bool add( const T t ); void removeAt( const int pos ); const int size() const; private: // void sort(); T *arr; int iSize; }; #include "sortedvector.cpp"
sortedvector.cpp: fast genauso, nur die zeile
#include "sortedvector.h"
hab ich rausgenommen.
jetzt kompiliert das ganze problemlos (ich denk mal die "segfault"-meldung liegt an meinem speichervergewaltigungs-code ...).
mfg,
julian