2011-09-19 4 views
1

C、テンプレートクラスを呼び出すために失敗:は私が(.HPPファイルを提供する)のようなテンプレートクラスを定義しました++

#ifndef PERSOANLVEC_H_ 
#define PERSOANLVEC_H_ 

#include <vector> 

using namespace std; 

template<class T, class PrnT> class PersoanlVec { 
public: 
    PersoanlVec(); 
    ~PersoanlVec(); 
    void push_back(T t); 
    void erase(int index); 
    PersoanlVec& operator[](int index); 
    const PersoanlVec& operator[](int index) const; 
    void print() const; 
    size_t size(); 
private: 
    vector<T> _vector; 
}; 

#endif /* PERSOANLVEC_H_ */ 

は今、すべてがこのクラスで[OK]をコンパイルします。私はそれを使用しようとすると undefined reference to PersoanlVec<Person, Person>::PersoanlVec()'を取得します。

#include "Person.h" 
#include "PersoanlVec.hpp" 
#include <cstdlib> 

int main(void) 
{ 
    Person p1("yotam"); 
    Person p2("yaara"); 
    PersoanlVec<Person,Person> *a = new PersoanlVec<Person,Person>(); //<---ERROR HERE 
    return EXIT_SUCCESS; 
} 

これは明らかに私のために非常に明確な、テンプレートと私の最初の試みであるそのない:私はそれを呼び出すのはここ です。パラメータのないコンストラクタはありますか? ありがとう!

+3

うわー、私はこれほど多くの一貫したスペルミスを見たことがありません。 – Puppy

+0

どこに 'PersoanlVec'の実装がありますか? (btw、それは 'PersonalVec'を意図したのですか?) –

+0

@DeadMG:ヘルパーのコーディングは二重です –

答えて

4

.cppファイルにコンストラクタと関数の内容がありますか?はいの場合、問題があります。クラス自体にちょうどインライン可能な、ヘッダファイルに入れ:

template<class T, class PrnT> class PersoanlVec { 
public: 
    PersoanlVec(){ 
     // code here... 
    } 

    ~PersoanlVec(){ 
     // code here... 
    } 

    void push_back(T t){ 
     // code here... 
    } 

    void erase(int index){ 
     // code here... 
    } 

    PersoanlVec& operator[](int index){ 
     // code here... 
    } 

    const PersoanlVec& operator[](int index) const{ 
     // code here... 
    } 

    void print() const{ 
     // code here... 
    } 

    size_t size(){ 
     // code here... 
    } 

private: 
    vector<T> _vector; 
}; 

ため、一見hereを持っています。

0

コンパイルプロセスにファイルを追加するのを忘れてしまいました。それは一般的な痛みを引き起こす可能性があるので、スペルミスに注意してください。

異なるコンパイルユニット(例えば、.h/.cppを持つクラスなど)があるときは、クラスはインターフェイスを知る必要があります。なぜなら、通常はヘッダファイルをインクルードする理由です。実装がバイナリファイルを一緒にバインドできるようにしてください。

このように、プロジェクトのすべての.cppファイルをコンパイラに渡す必要があります。それ以外の場合は、実装されていない部分を参照していることを知らせません。

+0

これは通常のクラスの場合ですが、クラステンプレートはそのルールに従いません。理由は、w00teまたは私の答えを参照してください。 – Xeo

0

CPPファイルではなく、ヘッダーファイルにすべてのテンプレート関数定義を保持する必要があります。これは基本的にテンプレート定義を複数回使用して、渡すパラメータに応じて複数の型を作成するためですあなたのコードの型パラメータとして。 CPPファイルで定義する必要のあるテンプレート関連の関数は、テンプレートの特殊化関数です(ユーザーが型AとBを渡してデフォルトのアクションの代わりにこれを行う場合)。

関連する問題