在c++11中使用用户定义的转换进行重载运算符推导
overloaded operator deduction using user-defined conversions in c++11
我的问题可能与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‘)
中的编译器错误
知道怎么解决这个问题吗?
Btw。我需要这种转换来只允许转换为const类型。
成员比较运算符不允许在左侧进行隐式转换,您需要将运算符设置为非成员函数:
class Complex {
public:
int data;
Complex(int i) : data(i) {}
};
bool operator < (const Complex& lhs, const Complex& rhs)
{ return lhs.data < rhs.data; }
实时演示
a < b
等价于a.operator<(b)
。
a
属于Holder
类型,并且没有名为operator<
的函数。
对成员函数的函数调用不会触发从Holder
到Complex
的隐式转换。
如果您手动将a
转换为const Complex&
,您的功能将起作用:
assert(((const Complex&)a) < b);
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用一个考虑到std::map中键值的滚动或换行的键
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- C++ - 重载'=',用于将十六进制值分配给对象
- 换行符(十六进制0x0A)是否可以合法嵌入 UTF8 中
- 重载输出运算符给出十六进制数字而不是字符串
- C++缩进重载了ostream运算符
- 将 XML 流转换为十六进制