在c ++ 11中使用用户定义的转换重载运算符推导

时间:2015-11-04 14:01:16

标签: c++ templates c++11 operator-overloading

我的问题可能与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类型。

2 个答案:

答案 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; }

Live Demo

答案 1 :(得分:0)

a < b相当于a.operator<(b)

a的类型为Holder,并且没有名为operator<的函数。

对成员函数的函数调用不会触发从HolderComplex的隐式转换。

如果您手动将a投射到const Complex&,您的功能将起作用:

assert(((const Complex&)a) < b);