Pregunta "Uso de tipo indefinido" con unique_ptr para reenviar la clase declarada y el constructor / asignación de movimiento predeterminado


En el siguiente código, ¿es la única forma de evitar un error de compilación e incluir B.h implementando el constructor / asignación de movimiento manualmente en A.cpp?

// A.h
#include <memory>
class B; // implementation somewhere in B.h/B.cpp
class A
{
public:
    A() = default;
    ~A() = default;
    A(const A&) = delete;
    A& operator=(const A&) = delete;
    A(A&&) = default;
    A& operator=(A&&) = default;

private:
    std::unique_ptr<B> m_b;
};

Visual Studio 2015 da "error C2027: uso de tipo indefinido", ya que el constructor de movimiento / operador de asignación de std :: unique_ptr llama al eliminador en m_b (que intenta invocar el destructor de B), que obviamente no se conoce en este momento.


5
2017-11-02 15:10


origen


Respuestas:


Sí, necesita tener acceso a la definición completa de B de donde sea que instanciate std::unique_ptr<B>::~unique_ptr, porque necesita llamar Bel destructor

En tu caso, eso significa que A::~ALa definición de 's debe moverse a un lugar separado A.cpp archivo, que incluye B.h.


8
2017-11-02 15:14