2013-07-23 54 views
0

我正在學習C++模板。我創建了一個模板類,用於添加兩個字符串 但我遇到以下錯誤:請幫我理解此錯誤。C++模板類定義獲取錯誤

main.cc:65:52: error: no matching function for call to TheNameHolder<std::basic_string<char> >::TheNameHolder(const char [8], const char [7])

using namespace std; 

template <class T> 
class TheNameHolder{ 
    T *a, *b; 
    public: 
    TheNameHolder(T *first, T *last) 
    { 
    a= first; 
    b= last; 
    } 
    T getName(); 
}; 

template <class T> 
T TheNameHolder<T> :: getName() 
{ 
    T returnVal; 
    returnVal = strcat (returnVal,a); 
    returnVal = strcat (returnVal, " "); 
    returnVal = strcat (returnVal, b); 
    return returnVal; 

} 


int main() 
{ 

    TheNameHolder <string> obj ("Hi", ""); 
    cout << obj.getName(); 
    return 0; 
} 
+0

你在構造函數指針與T聲明參數,但你傳遞一個字符串作爲主要論據。嘗試將您的參數類型更改爲const&T –

回答

4

什麼?否。這是不是使用什麼模板

你用你的模板對象strcat(實際上,在T*,等等指向你的對象)

strcat只接受char *。所以T必須是字符它的工作。如果您知道Tchar,那麼它不是一個模板,因爲您知道它是什麼。 (順便說一句 - 你有另一個bug,returnval應該是T*,你正在使用它未初始化)

你似乎錯過了模板的整個概念 - 這是因爲你正在學習。

請參閱 - 「我想使用模板添加兩個字符串」這句話是錯誤的 - 因爲您沒有任何未知數!你想添加2個字符串,你知道你的類型是什麼。它不是模板。

模板將是「我想添加兩個未知類型的列表」(然後您不能明顯地使用strcat,也不能假定您的列表是「零分隔」,因爲這隻適用於c樣式字符串) 。

3

你的模板參數是std::string,使你的構造

TheNameHolder(T *first, T *last) 

需要兩個指針std::string。你正在傳遞它的const數組char(字符串文字)。在我看來,你可以在std::string方面表現一切:

template <class T> 
class TheNameHolder{ 
    T a, b; 
    public: 
    TheNameHolder(const T& first, const T& last) : a(first), b(last) 
    { 
    } 
    T getName() { return a + " " + b; } 
}; 

int main() 
{ 
    TheNameHolder<std::string> obj("Hi", ""); 
    std::cout << obj.getName(); 
} 

注意它不是完全清楚你是否需要一個類模板這裏。這樣做的唯一好處是,您還可以使用std::wstring或任何其他支持字符串文字初始化和+運算符的字符串類型。

+0

這可能只是我對命名空間的無知,但是,由於他使用「命名空間標準」,因此他的不會被假定爲? –

+0

@BenC。是的,那是我的假設。我的代碼有所不同,因爲我從來不使用'namespace std',並且習慣使用'std ::'命名空間來限定標準庫類型。哦,也許你被拼寫錯誤的'std :: wstring'弄糊塗了。 – juanchopanza

0

如上所述,由於您已經知道數據類型,因此使用模板將會是錯誤的地方。但是,如果您真的希望「添加兩個未知類型的列表」,則可以使用模板特化來處理特定的(在這種情況下是非數字的)數據類型,例如字符串。 你會如下擅長此模板:

template <> class TheNameHolder <std::string> { ... };