1

現在、実装の詳細は異なりますが、同じアルゴリズムで使用されるイテレータのセットを作成しています。このため、それらはすべて同じインターフェースを持つ必要があります。これを実現するために、抽象反復子クラスを作成し、それ以降のすべての反復子でこのクラスから継承しました。

これにより、私のコードがどのように見えるかがわかります。

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;
                           ^

抽象クラスではなく、派生クラスで戻り値の型をオブジェクトに変更すると、「競合する戻り値の型が指定されました」というエラーが返されることが予想されます。

どうすればこれを機能させることができますか?

4

4 に答える 4

0

エラーが発生する理由

INodeIterator.h:16:27: error: invalid abstract return type for member function ‘virtual INodeIterator INodeIterator::operator++(int)’
     virtual INodeIterator operator++ (int i) =0;

純粋仮想関数が抽象クラス オブジェクトを返すためです。

1 つの解決策は、安全な new 演算子を使用して、ヒープに作成されたオブジェクトを返すことです。

 virtual INodeIterator& operator++ (int i) =0;

    NodeIterator& operator++ (int i)
    {
        NodeIterator* tmp = new NodeIterator (*this);
        ++(*this);
        return(*tmp);
    }
于 2013-05-22T07:22:41.933 に答える
0

あなたのプロトタイプは正しくありません。そのはず

NodeIterator operator++ (int i)

つまり、参照リターンを削除します。そうしないと、範囲外にあるものへの参照を返すことになります (あなたのtmp) 良い考えではありません!

そして、コンパイラはこれを知らせるのに非常に役立ちました!

あなたが聞きたかったこととはまったく違います。

于 2013-05-22T07:25:22.137 に答える