3

重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?
文字列(GCC)
C ++テンプレートで使用した場合の関数テンプレートへの未定義の参照、未定義の参照

C++プロジェクトをリンクする何かが欠けているように感じます。問題がヘッダーソースにあるのかインクルードにあるのかわからないので、それを示すために最小限のコードサンプルを作成しました。

メインモジュールminmain.cpp:

 #include <stdio.h>
 #include <vector>
 #include <string>
 #include "nodemin.h"

 using namespace std;

 int main()
 {
     // Blist libs are included
     Node<int>* ndNew = ndNew->Root(2);

     return 0;
 }

ヘッダーファイルnodemin.h:

 #ifndef NODETEMP_H_
 #define NODETEMP_H_

 using namespace std;

 template<class T>
 class Node
 {
 protected:

    Node* m_ndFather;
    vector<Node*> m_vecSons;
    T m_Content;

    Node(Node* ndFather, T Content);

 public:

     // Creates a node to serve as a root
         static  Node<T>* Root(T RootTitle);
 };

 #endif

ノードモジュールnodemin.cpp:

 #include <iostream>
 #include <string.h>
 #include <vector>
 #include "nodemin.h"

 using namespace std;

 template <class T>
 Node<T>::Node(Node* ndFather, T Content)
 {
    this->m_ndFather = ndFather;
    this->m_Content = Content;
 }

 template <class T>
 Node<T>* Node<T>::Root(T RootTitle) { return(new Node(0, RootTitle)); }

コンパイルライン:

 #g++ -Wall -g mainmin.cpp nodemin.cpp

出力:

 /tmp/ccMI0eNd.o: In function `main':
 /home/******/projects/.../src/Node/mainmin.cpp:11: undefined reference to`Node<int>::Root(int)'
 collect2: error: ld returned 1 exit status

オブジェクトにコンパイルしようとしましたが、リンクは失敗しました。

4

1 に答える 1

0

template class Node<int>;nodemin.cppに追加します。

#include <iostream>
#include <string.h>
#include <vector>
#include "nodemin.h"

using namespace std;

template <class T>
Node<T>::Node(Node* ndFather, T Content)
{
   this->m_ndFather = ndFather;
   this->m_Content = Content;
}

template <class T>
Node<T>* Node<T>::Root(T RootTitle) { return(new Node(0, RootTitle)); }

template class Node<int>;
于 2012-06-02T18:27:51.753 に答える