模板实例化错误

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

#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");
}

当我实例化与相同长度的字符串文字比较时,编译器不会抱怨。 当我用不同长度的文字做它时,它说“错误:没有用于比较调用的匹配函数(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<char const*>("aa", "bbbb");

另一方面,也许比较可以写成两种不同类型的工作? 这对于其他类型也是有用的,例如,如果a.size() < b.size()f(b)则可能调用f(a) a.size() < b.size() ,否则( f重载)。 (T1和T2允许与下面的类型相同,这将替代你的函数,而不是像上面两个那样重载它。)

template<typename T1, typename T2>
void compare(T1 const& a, T2 const& b) {
    // ...
}

如果您将声明更改为:

void compare(const T* a, const T* b)

原因是不同大小的字符数组的类型实际上是不同的类型。 如果在模板函数中使用了sizeof(T) ,编译器将不知道如何解决模糊问题。 通过上面的声明,你正在调用一个带有指针T类型的模板函数,当传递字符串时,编译器会很快地将其解析为const char*


如果可以的话,编译器会倾向于将字符串文字解释为字符缓冲区。 如果不是,它可以将它们解释为const char *。 然而,编译器不会做任何回溯,试图找到T的最佳解释。它并不复杂。 一旦它决定T是一个const char [3],它就会继续。 然后评估第二个参数失败。

如果你打电话给它

compare(static_cast<const char *>("aa"),static_cast<const char *>("bbbb"));

你很好走。

链接地址: http://www.djcxy.com/p/56997.html

上一篇: Template instantiation error

下一篇: How can I match on an attribute that contains a certain string?