我有模板功能"比较"定义如下.
#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");
}
Run Code Online (Sandbox Code Playgroud)
当我实例化比较相同长度的字符串文字时,编译器不会抱怨.当我用不同长度的文字做它时,它说"错误:没有匹配的调用比较函数(const char [3],const char [5])"
我很困惑,因为比较函数应该用字符指针而不是字符数组实例化.字符串文字不应该总是衰减到指针?
如果您将声明更改为:您的示例将编译:
void compare(const T* a, const T* b)
Run Code Online (Sandbox Code Playgroud)
原因是不同大小的字符数组的类型实际上是不同的类型.如果您sizeof(T)在模板函数中使用,编译器将不知道如何解决歧义.使用上面的声明,您将调用一个带有指针到T类型的模板函数,编译器将很快解析为const char*传递字符串时.
小智 4
正如格雷格的回答和评论中所述,两种不同的数组类型(因为这就是字符串文字)是问题所在。对于泛型类型,您可能希望按原样保留该函数,但对于字符指针和数组则重载它,当您想要稍微不同地对待它们时,这非常有用。
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]) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果您想明确指定比较应采用字符指针,则数组将自动转换:
compare<char const*>("aa", "bbbb");
Run Code Online (Sandbox Code Playgroud)
另一方面,也许可以编写比较来处理两种不同的类型?这对于其他类型也很有用,例如它可能调用f(a)if a.size() < b.size(),否则f(b)(f重载)。(下面允许 T1 和 T2 具有相同的类型,这将替换您的函数,而不是像上面两个那样重载它。)
template<typename T1, typename T2>
void compare(T1 const& a, T2 const& b) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |