現在、実装の詳細は異なりますが、同じアルゴリズムで使用されるイテレータのセットを作成しています。このため、それらはすべて同じインターフェースを持つ必要があります。これを実現するために、抽象反復子クラスを作成し、それ以降のすべての反復子でこのクラスから継承しました。
これにより、私のコードがどのように見えるかがわかります。
class INodeIterator
{
public:
virtual ~INodeIterator() {};
virtual bool operator!= (const INodeIterator& other) =0;
virtual bool operator== (const INodeIterator& other) =0;
virtual INodeIterator& operator++ () =0;
virtual INodeIterator& operator++ (int i) =0;
virtual Node& operator* () =0;
};
class NodeIterator : public INodeIterator
{
public:
/* snip */
NodeIterator& operator++ (int i)
{
NodeIterator tmp(*this);
++(*this);
return(tmp);
}
};
現在、イテレータでの C++ ポストインクリメント演算子のオーバーロード (-Wall -Werror でコンパイル) と同じ問題に直面しています。リンクされた質問の解決策は、参照の代わりにオブジェクトを返すことでした。
しかし、これは私にはうまくいきません。参照ではなくオブジェクトを返すようにインターフェイスと派生クラスの両方を変更すると、次のエラーが表示されます (抜粋、追加のファイル名などは削除されます)。
INodeIterator.h:16:27: error: invalid abstract return type for member function ‘virtual INodeIterator INodeIterator::operator++(int)’
virtual INodeIterator operator++ (int i) =0;
^
NodeIterator.h:33:22: error: invalid covariant return type for ‘virtual NodeIterator NodeIterator::operator++(int)’
NodeIterator operator++ (int i);
^
INodeIterator.h:16:27: error: overriding ‘virtual INodeIterator INodeIterator::operator++(int)’
virtual INodeIterator operator++ (int i) =0;
^
抽象クラスではなく、派生クラスで戻り値の型をオブジェクトに変更すると、「競合する戻り値の型が指定されました」というエラーが返されることが予想されます。
どうすればこれを機能させることができますか?