dire che ho due classi:Unique_ptr e dichiarazione anticipata
"foo.h"
#pragma once
class Foo
{
public:
Foo()
{
};
~Foo()
{
};
};
"A.h"
#pragma once
#include <memory>
class Foo;
class A
{
public:
A(){};
~A(){};
std::unique_ptr<Foo> foo;
};
A detiene un unique_ptr
di Foo
. Non volevo includere Foo
in "A.h", quindi l'ho inoltrato. Con solo in avanti dichiarando la classe Foo
in "Ah", ottengo un errore di compilazione:
error C2027: use of undefined type 'Foo'
error C2338: can't delete an incomplete type
Così stavo seguendo this articolo su come evitare questo errore e si è trasferito distruttore di A in un proprio file cpp in cui ho includere anche Foo:
"A.cpp"
#include "A.h"
#include "Foo.h"
A::A()
{
}
A::~A()
{
}
Dopo aver implementato il distruttore di a in "A.cpp", sono in grado di compilare il programma, perché la classe Foo è conosciuto in " A.cpp". Questo sembra logico, perché unique_ptr ha bisogno del tipo completo per chiamare il suo distruttore. Ma con mia sorpresa, dopo aver commentato il costruttore di A (in "A.h" e in "A.cpp"), ottengo lo stesso errore. Com'è possibile? Perché il compilatore si lamenta di non essere in grado di chiamare il distruttore di Foo quando A non ha un costruttore?
MODIFICA: Ho caricato i 4 file in modo da poter testare il programma. sto usando MSVC++ di Visual Studio 2013.
http://www.filedropper.com/test_61
'A' ha un costruttore quando si commento la vostra Constructo r: un costruttore predefinito viene fornito dal compilatore e questo costruttore ottiene una definizione in linea. – dyp
Sì, ma con il costruttore standard ottengo l'errore del compilatore che non può eliminare un tipo completo. Quando scrivo il mio costruttore vuoto, che dovrebbe apparire uguale a quello predefinito, non ottengo questi errori del compilatore. – abcheudg234
Mostraci il codice che non funziona? –