16

好的,伙计们...我有以下课程

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

     . . .
};

然后在我的 .cpp 文件中,我像这样定义了 ctor/dtor:

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

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

我的主要功能:

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

我得到以下链接错误:

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

我试图将构造函数定义放入头文件中,但没有出现错误。只有当我尝试在 cpp 文件中定义它时。

4

2 回答 2

24

不要在 cpp 文件中定义模板,而是将函数的实现放在头文件中,保持你的 main 函数不变。模板默认内联。因此它们对链接器不可见。并且包含 main() 的文件看不到模板的定义。因此错误。

于 2013-06-03T18:58:40.410 回答
0

最后留出空间试试。它可能被视为左移运算符!

template <typename TValue, typename TPred = std::less<TValue> >
于 2013-06-03T18:58:35.127 回答