Сначала прочитайте сообщения Herb Sutters GotW, касающиеся pimpl в С++ 11:
У меня возникли проблемы с пониманием решения, предложенного в GotW # 101. Насколько я понимаю, все проблемы, которые были решены в GotW # 100, вернулись с удвоенной силой:
-  
Элементы
pimplпредставляют собой шаблоны вне очереди, и определения не видны в месте использования (в определенииclass widgetкласса и неявно сгенерированные специальные функции-члены изwidget). Также нет никаких явных инстанций. Это приведет к нерешенным внешним ошибкам при связывании. -  
widget::implпо-прежнему не завершен в точке, гдеpimpl<widget::impl>::~pimpl()задан(я не думаю, что он на самом деле был экземпляр вообще, просто ссылки). Поэтомуstd::unique_ptr<widget::impl>::~unique_ptr()вызываетdeleteуказатель на неполный тип, который создает поведение undefined, еслиwidget::implимеет нетривиальный деструктор. 
Пожалуйста, объясните, что заставляет компилятор генерировать специальные элементы в контексте, где widget::impl завершено. Потому что я не вижу, как это работает.
Если GotW # 101 по-прежнему требует явного определения widget::~widget() в файле реализации, где widget::impl завершено, пожалуйста, объясните комментарий "Более прочный" (который он процитировал в своем ответе).
Я смотрю на основную претензию GotW # 101, что оболочка "исключает некоторые части шаблона", которая мне кажется (на основе остальной части абзаца) означает объявление widget::~widget() и определение. Поэтому, пожалуйста, не полагайтесь на это в своем ответе, в GotW # 101, который ушел!
Трава, если вы заходите, пожалуйста, дайте мне знать, было ли нормально отрезать + вставить код решения здесь для справки.