Идиома swap and copy не может использоваться в абстрактном классе

Я столкнулся с интересной ошибкой, когда попытался использовать идиому копирования и замены в абстрактном классе. Следующий код специально создан для демонстрации этой ситуации, если что-то не так, скажите мне, но не сосредотачивайтесь:

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

2 ответа

Ваш оператор присваивания должен взять ссылку:

iter& operator=(iter const&);

Там не будет / не может быть iter Один экземпляр в программе, будут только экземпляры производного класса, которые реализовали абстрактные функции. Вы не можете отрезать это и сделать копию только абстрактного базового класса.

Должен ли я объявить это в производном классе, а не здесь?

Похоже, путь.

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

Оператор присваивания должен принимать свой параметр как константную ссылку:

iter &operator=(const iter &);

Причина ошибки компиляции должна быть очень очевидной: передача параметра по значению требует, чтобы параметр был скопирован, что по умолчанию невозможно сделать с абстрактным классом.

Другие вопросы по тегам