-3

抽象クラスでコピー アンド スワップ イディオムを使用しようとすると、興味深いエラーが発生しました。次のコードは、この状況を示すために特別に作成されたものです。不適切なことがあれば教えてください。

template <typename T> class iter
{
public:
    iter();
    virtual ~iter();
    iter(const iter &);
    iter(iter &&) noexcept;
    iter& operator=(iter);
    virtual void swap(iter &);

    virtual bool operator!=(const iter&);
    virtual bool operator==(const iter&);
    virtual bool operator++() = 0;
    virtual bool operator--() = 0;

private:
    T* pointer;
};

エラーメッセージは次のとおりです。

iterator.h:10:18: error: cannot declare parameter to be of abstract       type 'iter<T>'
iter& operator=(iter);
              ^
iterator.h:3:28: note:   because the following virtual functions are pure within 'tier':
iterator.h:15:15: note:     virtual bool iter<T>::operator++()
virtual bool operator++() = 0;
           ^
iterator.h:16:15: note:     virtual bool iter<T>::operator--()
virtual bool operator--() = 0;

明らかにこの行がこのエラーを引き起こしているので、ここではなく派生クラスで宣言する必要がありますか、それとも他の高度な手法がありますか?

iter& operator=(iter);
4

2 に答える 2

3
iterator.h:10:18: error: cannot declare parameter to be of abstract
                         type 'iter<T>'
iter& operator=(iter);

代入演算子は、そのパラメーターを const 参照として受け取る必要があります。

iter &operator=(const iter &);

コンパイル エラーの理由は非常に明白です。パラメーターを値で渡すには、パラメーターをコピーする必要がありますが、これは既定では抽象クラスでは実行できません。

于 2016-05-22T21:39:50.010 に答える
3

代入演算子は参照を取る必要があります:

iter& operator=(iter const&);

iterプログラムにはインスタンスだけが存在することはありません。抽象関数を実装した派生クラスのインスタンスのみが存在します。それを切り取って、抽象基本クラスのみのコピーを作成することはできません。

ここではなく、派生クラスで宣言する必要がありますか?

進むべき道のように聞こえます。

于 2016-05-22T21:39:58.923 に答える