Проблема в этой функции:
void push(T& p) { q.push(p); }
Это копирует p
, и если p
является std::unique_ptr<int>
, это не сработает - это не копируется.
Если у вас просто есть WrappedQueue<T>
, функции-члены, не являющиеся virtual
, никогда не создаются, пока не будут фактически использованы. Так что это не ошибка, пока кто-то на самом деле не попытается push
lvalue. Вот почему std::vector<T>::push_back(T const&)
может существовать и в любом случае позволить вам иметь std::vector<std::unique_ptr<int>>
. Это нормально - это только ошибка, когда вы пытаетесь сделать что-то явно неправильное.
Однако, если у вас есть AbstractWrappedQueue<T>
- с виртуальными функциями-членами, и там правило более размытое: [temp.inst] / 10 :
Не определено, будет ли реализация неявно создавать экземпляр функции-члена шаблона класса, если в противном случае функция-член не была бы создана.
Ваша реализация в любом случае создает его экземпляр - и эта функция некорректна для T=std::unique_ptr<int>
. Отсюда и проблема.
Вы можете предотвратить это, либо не имея этой виртуальной функции, либо используя только копируемые типы.
<ч />
Примечание: вы, вероятно, хотите push(T const&)
, а не push(T&)
.