重载operator []的问题

时间:2014-12-04 14:16:53

标签: c++ type-conversion operator-overloading operators

我编写了以下代码并遇到了重载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 []?

2 个答案:

答案 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