2013-06-03 26 views
10

Ok ragazzi ... ho seguente classemodello di classe costruttore

#include <functional> 

template <typename TValue, typename TPred = std::less<TValue>> 
class BinarySearchTree { 
    struct TNode { 
     TValue value; 
     TNode *pLeft; 
     TNode *pRight; 
    }; 
public: 
    BinarySearchTree(); 
    ~BinarySearchTree(); 

    . . . 
private: 
    TNode *pRoot; 

    . . . 
}; 

poi nel mio file cpp ho definito la ctor/dtor come questo:

template <typename TValue, typename TPred> 
BinarySearchTree<TValue, TPred>::BinarySearchTree() : pRoot(0) {} 

template <typename TValue, typename TPred> 
BinarySearchTree<TValue, TPred>::~BinarySearchTree() { 
    Flush(pRoot); 
} 

mia funzione principale:

int main() {  
    BinarySearchTree<int> obj1; 
    return 0; 
} 

ed ottengo errore seguente collegamento:

public: __thiscall BinarySearchTree<int,struct std::less<int>>::BinarySearchTree<int,struct std::less<int> >(void) 

ho provato a mettere la definizione del costruttore nel file di intestazione e non ottengo alcun errore. solo se provo a definirlo nel file cpp.

+6

La risposta alla tua domanda è [qui] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file) - scusa, collegamento errato allo stretto voto –

risposta

17

Non definire i modelli nel file cpp, ma mettere l'implementazione delle funzioni nel file di intestazione e lasciare il vostro principale funzione così com'è. I modelli vengono allineati per impostazione predefinita. Pertanto non sono visibili al linker. E il file che contiene main() non può vedere la definizione dei template. Quindi l'errore.

+3

Vorrei che questo fosse più visibile su tutti i siti web di tutorial in C++. –

0

finalmente spazio e prova. potrebbe essere preso come operatore di spostamento a sinistra!

template <typename TValue, typename TPred = std::less<TValue> > 
+10

Va bene non aggiungere spazio tra '>>' dal C++ 11. – taocp

Problemi correlati