2012-02-09 38 views
0

我有一個類看起來如下喜歡:[連接錯誤]未定義參考`設置<std::string> ::包含(的std :: string常量&)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 -declaration-of-a-template-class-in-the) – 2012-02-09 16:45:21

回答

0

所以,這裏是

bool contains(const T& e) const; 

的定義是什麼?

看起來像你的定義是在其他文件。 模板函數的定義應該與類一起。 這不像正常的C++類。

+0

即使我將頭文件包含在implmentation文件中,那麼它也不允許我爲它創建另一個實現文件? – Zohaib 2012-02-09 16:43:33

+0

爲什麼你需要「另一個實現文件」? 如果您試圖隱藏模板的實現,那麼在C++中是不可能的。你必須公開它。 – PermanentGuest 2012-02-09 17:10:48

2

那麼,你應該實現模板類Set的功能。

請記住,模板函數必須內聯定義,所以您希望將定義放在同一個頭文件中。

+0

我已經在另一個.cc文件中實現了set類,其中包含了它的頭文件。 – Zohaib 2012-02-09 16:40:12

+0

這並不準確,關於模板函數必須內聯。它們不需要內聯,只需要可見即可實例化。但即使它們不可見,它們也可以顯式(或隱式)在不同的編譯單元中實例化,就像普通函數一樣。 – jpalecek 2012-02-09 16:45:25

+0

@Zohaib:把它放在'.h'文件中,這是最直接的方法 – jpalecek 2012-02-09 16:47:14

相關問題