gpt4 book ai didi

c++ - 解决 operator[] 的不明确重载

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:25 27 4
gpt4 key购买 nike

我有这门课:

class MyClass {

public:

int operator[](const std::string&);
const std::string& operator[](const int&) const;

...
};

但是,如果我调用带有 const 文字 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 可以是字符串或整数?),但我的问题是:有什么办法可以解决这个问题并保持运算符重载吗?

最佳答案

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

myclassMyClass&MyClass&:完美匹配

0intconst char*std::string:用户定义的转换

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

myclassMyClass&const MyClass&:const 限定条件

0intint:完美匹配

在这种情况下,当一个重载对于参数 X “更好”而另一个重载对于参数 Y “更好”时,两种重载都不能被认为是最好的重载,并且编译器必须提示(假设没有第三次重载击败两者)。

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

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

关于c++ - 解决 operator[] 的不明确重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13979254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com