Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Szablony klas - unresolved external symbol

Ostatnio zmodyfikowano 2011-05-03 22:26
Autor Wiadomość
kamillo121
Temat założony przez niniejszego użytkownika
Szablony klas - unresolved external symbol
» 2011-05-03 21:40:39
Witam, piszę w mvc++ 2008 pewien projekt i pewien błąd nie daje mi spokoju:

main.obj : error LNK2019: unresolved external symbol "public: __thiscall QT_Node<struct Foo>::~QT_Node<struct Foo>(void)" (??1?$QT_Node@UFoo@@@@QAE@XZ) referenced in function _SDL_main
main.obj : error LNK2019: unresolved external symbol "public: __thiscall QT_Node<struct Foo>::QT_Node<struct Foo>(void)" (??0?$QT_Node@UFoo@@@@QAE@XZ) referenced in function _SDL_main

Kod:

C/C++
//qt.h
struct Foo
{
    int a;
   
    Foo( int ac )
    {
        a = ac;
    }
   
    bool compare( Foo * a )
    {
        return true;
    }
};

template < class T >
class QT_Node
{
    QT_Node < T >* nodes[ 4 ];
    T ** data;
    int data_size;
   
public:
    QT_Node( T * );
    QT_Node();
    ~QT_Node();
    void addData( T * );
   
};

C/C++
//qt.cpp
template < class T >
QT_Node < T >::QT_Node( T * dat )
{
    data = 0;
    data_size = 0;
   
    if( dat )
    {
        data =( T ** ) malloc( sizeof( T * ) );
        data[ data_size ] = dat;
        data_size++;
    }
   
    nodes[ 0 ] = 0;
    nodes[ 1 ] = 0;
    nodes[ 2 ] = 0;
    nodes[ 3 ] = 0;
}

template < class T >
QT_Node < T >::QT_Node()
{
    data = 0;
    data_size = 0;
   
    nodes[ 0 ] = 0;
    nodes[ 1 ] = 0;
    nodes[ 2 ] = 0;
    nodes[ 3 ] = 0;
}

template < class T >
QT_Node < T >::~QT_Node()
{
    if( data )
    {
        for( int i = 0; i < data_size; i++ )
        {
            if( data[ i ] )
                 delete data[ i ];
           
        }
        delete[] data;
    }
   
    if( nodes[ 0 ] ) delete nodes[ 0 ];
   
    if( nodes[ 1 ] ) delete nodes[ 1 ];
   
    if( nodes[ 2 ] ) delete nodes[ 2 ];
   
    if( nodes[ 3 ] ) delete nodes[ 3 ];
   
}

template < class T > void QT_Node < T >::addData( T * dat )
{
    data_size++;
   
    if( !data )
    {
        data =( T ** ) malloc( sizeof( T * ) );
        data[ 0 ] = dat;
    }
    else
    {
        data =( T ** ) malloc( data_size * sizeof( T * ) );
        data[ data_size - 1 ] = dat;
    }
}

Błąd podany na samym początku występuje wtedy gdy stworze QT_Node w ten sposób:

C/C++
QT_Node < Foo > QT;

Proszę o pomoc Was rodaków...
Coś mi się wydaję, że to nie z kodem jest coś nie tak tylko z dołączaniem plików bo jak w nagłówku dodam ciało metod konstruktora i destruktora a z cpp usunę to działa tylko o co tu chodzi ?
P-32591
DejaVu
» 2011-05-03 22:20:39
Szablony mogą być tylko i wyłącznie w pliku nagłówkowym (*.h / *.hpp). Szablony nie są kompilowalne do postaci binarnej, więc nie wylądują w żadnej bibliotece.
P-32597
kamillo121
Temat założony przez niniejszego użytkownika
» 2011-05-03 22:26:27
O tym nawet nie pomyślałem. Wszystko muszę w nagłówku wsadzić w takim razie albo struktury voidem przerzucać i pozbyć się template.
Dzięki.
P-32599
« 1 »
  Strona 1 z 1