当我尝试在抽象类中使用复制 - 交换成语时遇到了一个有趣的错误。下面的代码是专门创建演示这种情况下,如果有什么不正确的,告诉我,但不集中:交换和复制成语不能在抽象类中使用
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);
伙计们:请注意,这是copy-and-swap idiom,所以operaoter =(iter)的重载使用copy而非const引用是故意的。请阅读更多有关复制和交换的内容,否则请不要投票。 –
免责声明不会违反语言的规则,你不能这样做,并且已经有两个很好的答案可以解释原因。 – skypjack
您不能使用抽象类的复制和交换(如本例所示) –