web-dev-qa-db-fra.com

Constructeur de classe de modèle

Ok les gars ... j'ai le cours suivant

#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;

     . . .
};

puis dans mon fichier .cpp j'ai défini le ctor/dtor comme ceci:

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

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

ma fonction principale:

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

et j'obtiens l'erreur de liaison suivante:

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

j'ai essayé de mettre la définition du constructeur dans le fichier d'en-tête et je ne reçois aucune erreur. seulement si j'essaie de le définir dans le fichier cpp.

13
schreda

Ne définissez pas de modèles dans le fichier cpp, mais mettez l'implémentation des fonctions dans le fichier d'en-tête et laissez votre fonction principale en l'état Les modèles sont en ligne par défaut. Par conséquent, ils ne sont pas visibles pour l'éditeur de liens. Et le fichier contenant main () ne peut pas voir la définition des modèles. D'où l'erreur. 

21
Ralph Tandetzky

laissez enfin de la place et essayez ... il peut être considéré comme un opérateur de gauche!

template <typename TValue, typename TPred = std::less<TValue> >
0
Dineshkumar