1

C++ プロジェクトのリンクに問題があり、何が問題なのかわかりません。コードの冗談。

clitest.cpp

#include <iostream>
#include "node.h"
using namespace std;

int main(int argc, char** argv)
{
    node<int> *ndNew = new node<int>(7);
    return 0;
}

node.h

#ifndef NODE_H
#define NODE_H
#include <vector>

template <typename T>
class node
{
    private:
        node<T>* ndFather;
        std::vector<node<T>* > vecSons;
    public:
        T* Data;
        node(const T &Data);
};
#endif

ノード.cpp

#include "node.h"

using namespace std;

template <typename T>
node<T>::node(const T &Data)
{
    this->Data = &Data;
    this->ndFather = 0;
    this->vecSons = (new vector<T>());
};

使用したコンパイラコマンドは

g++ -Wall -g clitest.cpp node.cpp -o clitest

エラーログは次のようになります

clitest.cpp: In function ‘int main(int, char**)’:
clitest.cpp:8:16: warning: unused variable ‘ndNew’ [-Wunused-variable]
     node<int> *ndNew = new node<int>(7);
                ^
/tmp/cc258ryG.o: In function `main':
clitest.cpp:8: undefined reference to `node<int>::node(int const&)'
collect2: error: ld returned 1 exit status
make: *** [blist] Error 1

私はかなりの時間をコードの移動に費やしました. 問題を特定しようとしましたが、基本的なことを見逃しています. または、C++ リンケージについて知らないことです.

4

2 に答える 2

0

テンプレートを使用する場合、コンパイラは、インスタンス化時にクラスのコードを生成する方法を知る必要があります。node<int>::node(int const &)未定義参照エラーは、コンパイラがコンストラクタを生成しなかったために発生します。たとえば、なぜテンプレートはヘッダー ファイルにしか実装できないのですか?を参照してください。

いくつかのオプションがあります。

  1. 実装を node.h に入れます (node.cpp は不要なので削除されます)。
  2. node.h の下部に #include されているファイルに実装を配置します (通常、ファイルは node.tpp と呼ばれます)。

実装を node.h に入れ、node.cpp を削除することをお勧めします。例のコードは有効な c++ ではないことに注意してください。メンバー変数 vecSons はポインターではないため、この行vecSons = new vector<T>()はコンパイラ エラーを発生させます。次のコードは、完全な実装の出発点になる可能性があります。

#ifndef NODE_H
#define NODE_H
#include <vector>

template <typename T>
class node
{
    private:
        node<T>* ndFather;
        std::vector<node<T>* > vecSons;
    public:
        const T* Data;
        node(const T &d) : 
            ndFather(0),
            vecSons(),
            Data(&d)
        {
        }
};
#endif
于 2013-05-15T03:30:28.587 に答える