我正在学习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 :(得分:4)
什么?不。这不是用于
的模板您在模板化对象上使用strcat
(实际上,在T*
上,指向对象的指针)
strcat
仅接受char *
。所以T
必须是char才能工作。如果您知道T
是char
,那么它就不是模板,因为您知道它是什么。 (顺便说一句 - 你有另一个returnval
应该是T*
的错误,并且你正在使用它未经初始化)
你似乎错过了模板的整个概念 - 这是正确的,因为你正在学习。
请参阅 - 句子“我想使用模板添加两个字符串”是错误的 - 因为你没有任何未知数!你想添加2个字符串,你知道你的类型是什么。它不是模板。
模板将是“我想添加两个未知类型的列表”(那么你显然不能使用strcat
,也不能假设你的列表是“零分隔”,因为这只适用于c风格字符串)。
答案 1 :(得分:3)
您的模板参数为std::string
,因此您的构造函数
TheNameHolder(T *first, T *last)
需要两个指向std::string
的指针。您传递的是char
的const数组(字符串文字)。在我看来,你可以用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
或任何其他支持字符串文字和+
运算符初始化的字符串类型。
答案 2 :(得分:0)
如上所述,由于您已经知道数据类型,因此这将是使用模板的错误位置。但是,如果您实际上希望“添加两个未知类型的列表”,则可以使用模板特化来处理特定的(在这种情况下为非数字)数据类型(如字符串)。 您可以按如下方式专门化此模板:
template <>
class TheNameHolder <std::string> {
...
};