我从 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实现代码,类实现代码不单独编译。”