c – 解决operator []的模糊重载

前端之家收集整理的这篇文章主要介绍了c – 解决operator []的模糊重载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这门课:
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&amp ;:完美匹配

0从int到const char *到std :: string:用户定义的转换

调用MyClass :: operator [](const int&)const涉及转换:

来自MyClass&的myclass到const MyClass&amp ;: const资格

0从int到int:完美匹配

在这种情况下,当一个重载对于参数X“更好”但是对于参数Y不同的重载是“更好”时,过载都不能被认为是最好的重载,并且编译器必须抱怨(假设没有第三次重载超过两者) .

是否可以将两个重载更改为const或两个非const?如果没有,您可以添加第三个重载来处理这种情况:

const std::string& operator[](int n) {
    return static_cast<const MyClass&>(*this)[n];
}

猜你在找的C&C++相关文章