Вместо copy
метода вы должны вместо этого реализовать конструктор копирования. Было бы странно, чтобы конструктор копирования передавал свой экземпляр. Если вы настаиваете на проверке, вы можете использовать утверждение.
template <class T>
Queue<T>::Queue(Queue<T> const & other)
: m_cap(other.m_cap), m_size(0), m_front(), m_back()
{
assert(&other != this);
enqueue(other);
}
Ваш copy
метод на самом деле является заданием. Более естественно реализовать оператор присваивания. Этого можно достичь, следуя идиоме подкачки копии.
template <class T>
Queue<T> & Queue<T>::operator = (Queue<T> other)
{
swap(*this, other);
return *this;
}
Существует также идиоматический способ реализации swap
(научил меня Мунинг Дак давным-давно):
template <class T>
class Queue {
//...
friend void swap(Queue &a, Queue &b) {
using std::swap;
swap(a.m_front, b.m_front);
swap(a.m_back, b.m_back);
swap(a.m_size, b.m_size);
swap(a.m_cap, b.m_cap);
}
};
Таким образом, вы можете использовать зависимый от аргумента поиск (ADL), чтобы выбрать специфичную для типа реализацию swap
, если она доступна. И теперь Queue
сама имеет такую реализацию, которая используется оператором присваивания. Но это также может быть использовано в случае, если Queue
помещен внутри объекта, который хочет реализовать swap
для себя.