0

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

3 回答 3

4

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

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

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

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

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

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

于 2013-07-23T19:11:51.440 回答
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或任何其他支持从字符串文字和+运算符初始化的字符串类型。

于 2013-07-23T19:06:07.830 回答
0

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

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

于 2013-07-23T20:38:44.447 回答