我有这门课:
class MyClass { public: int operator[](const std::string&); const std::string& operator[](const int&) const; ... };
但是,如果我调用第二个运算符w / const literal 0,它的工作量很大:
MyClass myclass; std::cout << myclass[0] << std::endl;
我收到了这个错误:
In function 'int main()': ambiguous overload for 'operator[]' in 'myclass[0]' note: candidates are: note: const int MyClass::operator[](const string&)| note: const string& MyClass::operator[](const int&) const
我想我明白了什么情况(0可以是字符串或int?),但我的问题是:有没有办法解决这个问题并保持运算符重载?
解决方法
调用MyClass :: operator [](const std :: string&)涉及转换:
来自MyClass&的myclass到MyClass& ;:完美匹配
0从int到const char *到std :: string:用户定义的转换
调用MyClass :: operator [](const int&)const涉及转换:
来自MyClass&的myclass到const MyClass& ;: const资格
0从int到int:完美匹配
在这种情况下,当一个重载对于参数X“更好”但是对于参数Y不同的重载是“更好”时,过载都不能被认为是最好的重载,并且编译器必须抱怨(假设没有第三次重载超过两者) .
是否可以将两个重载更改为const或两个非const?如果没有,您可以添加第三个重载来处理这种情况:
const std::string& operator[](int n) { return static_cast<const MyClass&>(*this)[n]; }
原文地址:https://www.jb51.cc/c/117561.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。