我有如下定义的模板函数“比较”。

#include<iostream>
using namespace std;

template<typename T>
void compare(const T&a, const T& b)
{
    cout<<"Inside compare"<<endl;
}

main()
{
compare("aa","bb");
compare("aa","bbbb");
}

当我实例化与相同长度的字符串文字进行比较时,编译器不会提示。当我用不同长度的文字执行此操作时,它会显示“错误:没有匹配函数可调用compare(const char [3],const char [5])”

我很困惑,因为比较函数应该使用字符指针而不是实例化
字符数组。
字符串文字不应该总是衰减到指针吗?

最佳答案

正如格雷格的答案和评论所述,两种不同的数组类型(因为这就是字符串文字)是问题所在。对于泛型类型,您可能希望保留原样的功能,但对于字符指针和数组,应重载它,这在您希望稍微区别对待它们时非常有用。

void compare(char const* a, char const* b) {
    // do something, possibly use strlen()
}

template<int N1, int N2>
void compare(char const (&a)[N1], char const (&b)[N2]) {
    // ...
}

如果要指定compare应该显式使用字符指针,则数组将自动转换:
compare<char const*>("aa", "bbbb");

另一方面,也许可以编写比较来使用两种不同的类型?这对于其他类型也可能很有用,例如也许如果f(a)调用a.size() < b.size(),否则调用f(b)(f重载)。 (下面允许T1和T2为同一类型,这将替换您的函数,而不是像上面两个函数那样重载它。)
template<typename T1, typename T2>
void compare(T1 const& a, T2 const& b) {
    // ...
}

关于c++ - 模板实例化错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1052102/

10-15 00:31