1

型に値を代入する際の奇妙な問題のように思われることに困惑しています。これは私に問題を与えるコードです:

1. ListIterator<int> itr = lst.begin();
2.itr++;
3.itr = lst.begin();

したがって、1行目と2行目は正常に機能します。ただし、宣言後に itr = lst.begin() を作成しようとすると、次のエラーが発生します。

ListMain.cpp:46: error: no match for ‘operator=’ in ‘itr = lst. List<T>::begin [with T =      int]()’
List.h:183: note: candidates are: void ListIterator<T>::operator=(ListIterator<T>&)   [with T = int]

今、私の operator= は現在これです:

void operator = (iterator & rhs) {theList = rhs.theList; currentLink = rhs.currentLink;}

したがって、私の begin() 関数は ListIterator を返すので、これは単にリスト イテレータを再割り当てするべきではありませんか、それとも何か不足していますか?

この問題に対する洞察をいただければ幸いです。

4

1 に答える 1

2

非constoperator=参照によって引数を取ります。そのため、一時オブジェクト ( によって返されるオブジェクトなどbegin()) はそれにバインドできません。カスタムのコピー代入演算子が必要な場合は、次のように変更します。

void operator = (const iterator & rhs) {theList = rhs.theList; currentLink = rhs.currentLink;}

さらに、演算子を標準ライブラリの要件に準拠させるには、割り当て先のオブジェクトへの参照を返すように変更する必要があります。

iterator& operator = (const iterator & rhs) {
  theList = rhs.theList;
  currentLink = rhs.currentLink;
  return *this;
}

最後に、カスタム代入演算子が必要ですか? あなたのすることは、メンバーの割り当てだけです。それらがすべてメンバーである場合は、演算子を完全に削除して、コンパイラによって生成された演算子に依存することをお勧めします。

于 2013-10-16T07:10:05.170 に答える