10

リストクラスのメンバークラスとしてイテレータクラスを作成しようとしています。また、間接演算子(*)をオーバーロードして、それが指しているリストにアクセスしようとしています。

template<class T>
T list<T>::iterator::operator*(iterator& iter)
{
    return ((iter.lstptr)->current)->data;
}

ここlstptrで、はリストへのcurrentポインタ、はノードクラスへのポインタ、ノードクラスにdataはタイプ。のデータメンバーが含まれていますT

イテレータは次のように宣言されます。

template<class T>
class list
{
public:
class iterator;
};

template<class T>
class list<T>::iterator
{
//stuff
};

オーバーロードされた演算子*の関数定義を正常にコンパイルできますが、次のようなことをしようとすると、次のようになります。

list<int> lst1;
lst1.add(6);
list<int>::iterator IT;
IT = lst1;
//everything above this point compiles fine
int a = *IT; //error here (line fourteen)

表示されるエラーは、<1>は不正な間接参照を使用していること、<2>はlist::iteratorからintに変換できないことを示しています。両方のエラーは14行目で発生します。

誰かが私が間違っていることと、間接演算子を正しくオーバーロードする方法を知っていますか?

注意:さらにコードを表示する必要がある場合は、どの部分を教えてください。コード全体をここに配置したくないのは、205行であり、そのうちの204行にはエラーがないためです。

4

2 に答える 2

15

乗算演算子をオーバーロードしました。パラメータを取り出して間接演算子にします。

template<class T>
T list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}

*IT = 3;コードをコンパイルしたい場合は、参照を返す必要もあります。

template<class T>
T& list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}
于 2009-05-20T23:19:39.930 に答える
7

ここには2つの問題があります。1つ目は、間接参照演算子ではなく、乗算演算子を誤ってオーバーロードしたことです。2つ目は、参照型を返さなかったことです。

最初の問題は、パラメーターの数の結果として発生します。クラスのすべての非静的メンバー関数には、追加の「非表示」パラメーターがありますthisthisもちろん、関数が呼び出されているオブジェクトへのポインタです。その結果、実際には2つのパラメーターをとる演算子のバージョンを宣言しました。2番目のイテレータパラメータを削除してで操作すると、バイナリではなくthis単項がオーバーロードされます。*

2番目の問題は、リターンタイプのマイナーな問題です。元のオブジェクト自体ではなく、元のオブジェクトにコピーを返します。参照を返すように戻りタイプを宣言しT&ます。

于 2009-05-20T23:48:04.040 に答える