Visual Studio から次のエラーが発生しました。
エラー LNK2019: 未解決の外部シンボル "public: __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 を行うため.実装コード、クラス実装コードは個別にコンパイルされません。」