0

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 を行うため.実装コード、クラス実装コードは個別にコンパイルされません。」

4

0 に答える 0