C++模板类定义出错

C++ Template Class definition getting error

本文关键字:定义 出错 C++      更新时间:2023-10-16

我正在学习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;
}

什么?不。这不是模板的用途

您在模板化对象上使用strcat(实际上,在T*上,在指向对象的指针上

(

strcat只接受char *。因此,T必须字符才能正常工作。如果你知道Tchar,那么它就不是一个模板,因为你知道它是什么。(顺便说一句 - 您有另一个错误,returnval应该T*,并且您正在使用未初始化的(

您似乎错过了模板的整个概念 - 这没关系,因为您正在学习。

看 - 句子"我想使用模板添加两个字符串"是错误的 - 因为你没有任何未知数!你想添加 2 个字符串,你知道你的类型是什么。它不是模板。

模板将是"我想添加两个未知类型的列表"(那么你显然不能使用strcat,也不能假设你的列表是"零分隔的",因为这仅适用于 c 样式字符串(。

你的模板参数是std::string ,所以你的构造函数

TheNameHolder(T *first, T *last)

期望两个指针std::string.您正在向其传递 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 或任何其他支持从字符串文本和 + 运算符初始化的字符串类型。

如上所述,这将是使用模板的错误位置,因为您已经知道数据类型。但是,如果您实际上可能希望"添加两个未知类型的列表",则可以使用模板专用化来处理特定(在本例中为非数字(数据类型,例如字符串。您将按如下方式专门化此模板:

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