0

我从 Visual Studio 收到以下错误:

错误 LNK2019:未解析的外部符号“公共:__thiscall BSTree::BSTreeNode::BSTreeNode(class TestData const &,class BSTree::BSTreeNode *,class BSTree::BSTreeNode *)”(??0BSTreeNode@?$BSTree@VTestData@@ H@@QAE@ABVTestData@@PAV01@1@Z) 在函数“protected: void __thiscall BSTree::insertHelper(class TestData const &,class BSTree::BSTreeNode * &)”(?insertHelper@?$BSTree@VTestData @@H@@IAEXABVTestData@@AAPAVBSTreeNode@1@@Z)

以下是编译器带来的问题:

template < typename DataType, class KeyType >
BSTree<DataType,KeyType>::BSTreeNode::BSTreeNode ( const DataType &nodeDataItem, 
BSTreeNode *leftPtr, BSTreeNode *rightPtr ) {
    left = leftPtr;
    right = rightPtr;
    dataItem = nodeDataItem;
}

template < typename DataType, class KeyType >
void BSTree<DataType,KeyType>::insertHelper (const DataType& d, BSTreeNode*& b) {
    if (b == 0) {
        b = new BSTreeNode(d, 0, 0);
    } 
    else if (d.getKey() < b->dataItem.getKey()) {
        insertHelper(d, b->left);
    }
    else if (d.getKey() > b->dataItem.getKey()) {
        insertHelper(d, b->right);
    }
    else {
        b->dataItem = d;
    }
}

所以我查看了它们,我相信我的代码看起来是正确的。所以我执行了重建,然后没有错误,程序启动得很好。我问我的实验室导师为什么会发生这种情况,但他说他没有合适的答案。当我的项目变得越来越复杂时,我看到的越来越多。

我做了一些研究:

构建、重建和清理解决方案之间的区别

我总是需要清理/重建吗?

这是在使用 Visual Studio IDE 时不可避免地发生的事情吗?我能做些什么来防止这种情况发生吗?出现此问题是否有任何后果(即我的代码中是否存在缺陷)?

更新:看来这可能是我本学期目睹的大部分链接器错误的原因。

这是一本书的建议:

“编译使用模板类的程序需要更改使用 #include 预处理器指令包含哪些文件,以及程序的编译方式。由于 C++ 编译器如何处理模板代码,创建类对象的程序(例如, main.cpp) 必须包含类实现文件,而不是类声明文件。也就是说,它必须做#include "Classname.cpp"而不是通常#include "Classname.h"的规则在本书的其余部分有效。因为主实现文件做了一个类的#include实现代码,类实现代码不单独编译。”

4

0 回答 0