我的问题可能与http://en.cppreference.com/w/cpp/language/overload_resolution#Call_to_an_overloaded_operator有关。 但在我的情况下,我有const复杂类型:
class Complex {
public:
int data;
Complex(int i) : data(i) {}
bool operator < (const Complex& other) const { return data < other.data; }
};
class Holder {
public:
Complex data;
Holder(int i) : data(i) {}
operator const Complex&() const { return data; }
};
//...
Holder a(1), b(2);
assert(a < b); //Error
g ++ 4.9中的编译器错误:no match for ‘operator<’ (operand types are ‘Holder‘ and ‘Holder‘)
任何想法如何解决这个问题?
顺便说一下。我需要转换为仅允许转换为const类型。
答案 0 :(得分:4)
成员比较运算符不允许在左侧进行隐式转换,您需要使运算符成为非成员函数:
class Complex {
public:
int data;
Complex(int i) : data(i) {}
};
bool operator < (const Complex& lhs, const Complex& rhs)
{ return lhs.data < rhs.data; }
答案 1 :(得分:0)
a < b
相当于a.operator<(b)
。
a
的类型为Holder
,并且没有名为operator<
的函数。
对成员函数的函数调用不会触发从Holder
到Complex
的隐式转换。
如果您手动将a
投射到const Complex&
,您的功能将起作用:
assert(((const Complex&)a) < b);