-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 回答