2014-04-04 27 views
0

當我創建一個接受typename的函數時,我可以在沒有類的情況下創建它,但是當我嘗試將這個功能放入類中時,它會給我帶來錯誤。任何人都可以向我解釋我必須做些什麼才能讓它工作,爲什麼?工作情況類中的typename功能

例子:這是當我不把它一類

template<typename T> 
bool Test(const char* _pcSection, const char* _pcKey, T& _tValue) 
{ 
    return true; 
} 

失敗的例子中:當我嘗試不幹了裏面的類(這樣我就可以訪問成員變量)

class CIniParser 
{ 
    public: 
     template<typename T> 
     bool GetValue(const char* _pcSection, const char* _pcKey, T& _tValue); 
} 

///////////////////////// 
//Inside the .cpp... 
template<typename T> 
bool CIniParser::GetValue(const char* _pcSection, const char* _pcKey, T& _tValue) 
{ 
    //do stuff 
    return true; 
} 

任何幫助將是巨大的:)

+1

定義內嵌在* .h – jsantander

+3

中的方法[爲什麼模板只能在**頭文件中實現**](http://stackoverflow.com/questions/495021/why-can-templates-only-在頭文件中實現) – WhozCraig

+2

「它給我錯誤」不是在堆棧溢出上進行通信的適當方式。 –

回答

1

實際並沒有任何編譯直到你實例化一個實際模板類的實例。因此,將函數定義放在cpp中是沒有意義的:它們需要對使用該模板的每個編譯單元都可見。

正常的做法是將函數定義放在與模板聲明相同的頭文件中。

(您可以將整個模板聲明和定義放在源文件中,但前提是它們的唯一用途在該文件中)。

+0

這裏正常取決於商店。要做的「正常」事情是將模板的函數定義放在一個單獨的,專門命名的文件中,並將其包含在頭部的末尾。 (我見過的最常見的約定是'.tcc',但是這一直都在Unix世界中,普通的源代碼是'.cc',正常的頭文件是'.hh'。我不知道約定是什麼將會出現在正常源代碼爲'.cpp'的地方。) –

+0

感謝您提供簡短而簡潔的答案,我只是將函數放入.h文件中,並且工作正常。這是一個長期以來的問題,雖然我保留的那些是我一直在.h中定義的那些,但我之前的印象是它把它放在導致問題的階級裏,而不是它在哪裏。現在我明白了爲什麼。謝謝 :) – Matt