Идиома 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 &);
Причина ошибки компиляции должна быть очень очевидной: передача параметра по значению требует, чтобы параметр был скопирован, что по умолчанию невозможно сделать с абстрактным классом.