¿Cómo uso unique_ptr para pimpl?

Aquí hay una simplificación de lo que estoy viendo cuando intento usar unique_ptr para pimpl. Elegí unique_ptr porque realmente quiero que la clase sea propietaria del puntero; quiero que la vida útil del puntero de pimpl y la clase sean las mismas.

e todos modos, aquí está el encabezado:

#ifndef HELP
#define HELP 1

#include <memory>

class Help
{

public:

  Help(int ii);
  ~Help() = default;

private:

  class Impl;
  std::unique_ptr<Impl> _M_impl;
};

#endif // HELP

Aquí está la fuente:

#include "Help.h"

class Help::Impl
{
public:
  Impl(int ii)
  : _M_i{ii}
  { }

private:

  int _M_i;
};

Help::Help(int ii)
: _M_impl{new Help::Impl{ii}}
{ }

Podría compilarlos en una biblioteca muy bien. Pero cuando trato de usarlo en un programa de prueba obtengo

ed@bad-horse:~/ext_distribution$ ../bin/bin/g++ -std=c++0x -o test_help test_help.cpp Help.cpp
In file included from /home/ed/bin/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/memory:86:0,
                 from Help.h:4,
                 from test_help.cpp:3:
/home/ed/bin/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = Help::Impl]':
/home/ed/bin/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/unique_ptr.h:245:4:   required from 'void std::unique_ptr<_Tp, _Dp>::reset(std::unique_ptr<_Tp, _Dp>::pointer) [with _Tp = Help::Impl; _Dp = std::default_delete<Help::Impl>; std::unique_ptr<_Tp, _Dp>::pointer = Help::Impl*]'
/home/ed/bin/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/unique_ptr.h:169:32:   required from 'std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = Help::Impl; _Dp = std::default_delete<Help::Impl>]'
Help.h:6:7:   required from here
/home/ed/bin/lib/gcc/x86_64-unknown-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/unique_ptr.h:63:14: error: invalid application of 'sizeof' to incomplete type 'Help::Impl'

Este es un @ bien conocicaracterística de segurida. He tratado de seguir.

Mi problema es que si pongo la declaración Ayuda :: Impl en un encabezado, parecería obviar cualquier ventaja de pimpl. El diseño de la clase es visible para los usuarios. La definición está oculta, pero podría haberlo hecho con la clase de Ayuda y los miembros privados. Además, incluir la declaración de Impl trae nuevos encabezados que me hubiera gustado mantener separados.

¿Qué me estoy perdiendo? ¿Qué ponen las personas en una declaración Impl y dónde? ¿Estoy haciendo mal la Ayuda dtor? Argh!

Respuestas a la pregunta(4)

Su respuesta a la pregunta