C ++模板类定义获取错误

时间:2013-07-23 19:01:52

标签: c++ templates

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

3 个答案:

答案 0 :(得分:4)

什么?不。这不是用于

的模板

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

strcat仅接受char *。所以T必须是char才能工作。如果您知道Tchar,那么它就不是模板,因为您知道它是什么。 (顺便说一句 - 你有另一个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> { ... };