如何在C ++中重载索引运算符?

时间:2013-10-21 19:45:47

标签: c++ operator-overloading

我有以下代码声明了一个重载operator[]的类,如下所示:

#include <iostream>
#include <vector>

using namespace std;

class BitSet
{
private:
    int size;
public:
    vector<int> set;
    int &operator [] (int index) {
        return set[index];
    }
    BitSet(int nsize = 0)
    {
        cout << "BitSet creating..." << endl;
        size = nsize;
        initSet(size);
    }
    void initSet(int nsize)
    {
        for (int i = 0; i < nsize; i++)
        {
            set.push_back(0);
        }
    }
    void setValue(int key, int value)
    {
        set[key] = value;
    }
    int getValue(int key, int value)
    {
        return set[key];
    }

};

但是,当我尝试在此代码中使用它时:

#include <iostream>
#include <stdio.h>
#include "BitSet.h"

using namespace std;

int main()
{
    BitSet *a;
    cout << "Hello world!" << endl;
    a = new BitSet(10);
    a->setValue(5, 42);
    cout << endl << a[5] << endl; // error here
    return 0;
}

我收到此错误:

  

main.cpp|15|ошибка: no match for «operator<<» in «std::cout.std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>](std::endl [with _CharT = char, _Traits = std::char_traits<char>]) << *(a + 200u)»|

我执行operator[]时出了什么问题?

1 个答案:

答案 0 :(得分:9)

此问题与您operator[]的实施无关。请注意,您已将a声明为

BitSet *a;

因此,当你写

cout << a[5] << endl;

编译器将其解释为“a指向的数组中第5位的get元素,然后输出它。”这不是您想要的,它会导致错误,因为BitSet没有定义operator<<。 (请注意,您获得的实际错误大约是operator<<中的BitSet,而不是约operator[]。)

尝试将行更改为

cout << (*a)[5] << endl

或者,更好的是,只需声明BitSet而不将其作为指针。

希望这有帮助!