#include <iostream>
using namespace std;
class A {
public:
A(const string &str):str(str){}
operator string() const { return str; }
string str;
};
class B {
public:
B(int i):i(i){}
operator int() const { return i; }
int i;
};
template<typename T>
int compare(const T &a, const T &b)
{
if(a < b) return -1;
if(b < a) return 1;
return 0;
}
int main()
{
A a1("a"),a2("b");
B b1(10),b2(20);
// 这里为什么不能调用 compare(a1,a2)
// a1和a2应该都能转换成string,而且string也定义了 < 运算符
//cout<<compare(a1,a2)<<endl;
cout<<compare(b1,b2)<<endl;
return 0;
}
因为
std::string
的operrator<
是一个模板模板参数推断是不考虑自定义转换的。当参数是
A
的时候,模板参数是推断不出来的。所以直接就失败了。