我编写了以下代码并遇到了重载operator []的问题。 这是testmain.cpp的代码:
#include"test.hpp"
int main()
{
C tab = C(15);
bool b = tab[2];
return 0;
}
这是头文件test.hpp:
#ifndef _test_
#define _test_
class C
{
friend class ref;
int s;
public:
class ref
{
public:
bool v;
ref();
ref(bool x);
ref& operator = (ref a);
ref& operator = (bool x);
};
C();
C(int a);
bool operator[] (int i) const ;
ref operator[] (int i);
};
#endif ///_test_
当我尝试编译代码时,出现以下错误:
testmain.cpp: In function ‘int main()’:
testmain.cpp:6:16: error: cannot convert ‘C::ref’ to ‘bool’ in initialization
看起来编译器会自动假设我的索引operator []将始终返回ref类型的对象,并忽略返回boolean类型变量的operator []。 是否可以修复代码,以便编译器“知道”何时使用适当的重载operator []?
答案 0 :(得分:2)
返回bool
的重载是const
,因此仅在应用于常量C
对象时才会使用。您的const
不是const
,因此选择非ref
重载。
一种解决方案是将bool
隐式转换为operator bool() const {return v;}
:
bool
这样您就可以使用重载以相同的方式读取{{1}}值。
答案 1 :(得分:2)
您有operator[]
的两个实现...一个用于const
个对象,另一个用于非const对象。你的main有一个非const的C实例,所以它调用了非const运算符,它返回一个ref
。