2

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[]ますか?

4

1 に答える 1

9

この問題は、 の実装とは関係ありませんoperator[]aとして宣言したことに注意してください

BitSet *a;

したがって、あなたが書くとき

cout << a[5] << endl;

aコンパイラはこれを「 が指す配列の 5 番目の位置にある要素を取得し、それを出力する」と解釈します。これはあなたが望むものではありません.BitSetが定義されていないため、エラーが発生しますoperator<<. operator<<(実際に発生しているエラーは aboutではBitSetなくabout であることに注意してくださいoperator[])。

読む行を変えてみてください

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

または、さらに良いBitSetことに、ポインタにせずに宣言するだけです。

お役に立てれば!

于 2013-10-21T19:50:13.460 に答える