2012-02-09 9 views
0

私は以下の同類を見てクラスがあります。私は、このクラスのメンバーを作るとき[リンカエラー] `<std::string>を設定するには、未定義の参照が::「(STD ::文字列のconst&)のconstが含まれてい

template<typename T> 
    class Set{ 
    public: 
    bool contains(const T& e) const; 
    }; 

をある別のクラス:

class Dfa { 
    private: 
    Set<string> F; 
    public: 
    bool accepts() const 
    { 
    string temp; 
    return F.contains(temp); 
    } 
    }; 

まあ、実際のクラスのこれらのrはちょうどいくつかの機能と機能ステートメント。私はそれをコンパイルするとき

[Linker error] undefined reference to `Set<std::string>::contains(std::string const&) const' 

とどのように私はこのエラーを修正することができます:私はエラーを取得するか、なぜ誰も教えてくださいすることができます。ありがとう

+0

[テンプレートクラスの実装と宣言が同じヘッダーファイルにあるのはなぜですか?](http://stackoverflow.com/questions/3749099/why-should-the-implementation-and-the -dテンプレートのクラス名を指定する) –

答えて

0

だから、どこ

bool contains(const T& e) const; 

の定義は?

あなたの定義が他のファイルにあるようです。 テンプレート関数の定義は、クラスと共に行う必要があります。 これは通常のC++クラスと似ていません。

+0

埋め込みファイルにヘッダファイルを含めても、別の実装ファイルを作ることができません。 – Zohaib

+0

なぜ "別の実装ファイル"が必要でしょうか? テンプレートの実装を非表示にする場合は、C++では実装できません。それを公開する必要があります。 – PermanentGuest

2

よく、テンプレートクラスSetの機能を実装する必要があります。

テンプレート関数はインラインで定義する必要があるので、同じヘッダーファイルに定義を入れたいと思います。

+0

setクラスを別の.ccファイルに実装しました。そこにはヘッダファイルが含まれています。 – Zohaib

+0

これは正確ではありません。テンプレート関数はインラインでなければなりません。インラインである必要はなく、インスタンス化できるように表示する必要があります。しかし、たとえそれが見えなくても、通常の関数と同じように、別のコンパイル単位で明示的に(または暗黙的に)インスタンス化することができます。 – jpalecek

+0

@Zohaib: '.h'ファイルに入れて、それは最も直接的なアプローチです。 – jpalecek

関連する問題