模板实例化错误
我有如下定义的模板函数“比较”。
#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?