У меня есть класс с именем FiniteStateMachine, объявленный как показано ниже
заголовочный файл: FiniteStateMachine.h
class FiniteStateMachine
{
public:
//Constructor
FiniteStateMachine();
//Destructor
~FiniteStateMachine();
}
исходный файл: FiniteStateMachine.cpp
////////////////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////////////////
FiniteStateMachine::FiniteStateMachine()
:m_InitialState("")
,m_CurrentState(NULL)
,m_Running(false)
{
RegisterBaseTypes();
}
////////////////////////////////////////////////////////////////////////
// Destructor
////////////////////////////////////////////////////////////////////////
FiniteStateMachine::~FiniteStateMachine()
{
if (m_Running) Stop();
Clear();
}
и у меня есть заголовочный файл с именем FSM, который я собираю в нем весь класс проекта
FSM.H
class ICORE_API FiniteStateMachine;
Хорошо, я скомпилировал его и теперь хочу использовать этот класс в другой библиотеке.
все, что связано с этой библиотекой, уже сделано.
в клиентском классе, когда я использую FiniteStateMachine с auto_ptr, я получаю ошибку компоновщика:
#include "FSM.H"
std::auto_ptr<FiniteStateMachine > fsm;
error LNK2019: unresolved external symbol "public: __thiscall IFSM::FiniteStateMachine::~FiniteStateMachine(void)" (??1FiniteStateMachine@IFSM@@QAE@XZ) referenced in function "public: void * __thiscall FSM::FiniteStateMachine::`scalar deleting destructor'(unsigned int)" (??_GFiniteStateMachine@IFSM@@QAEPAXI@Z)
но, заявив, как это
#include FSM.h
FiniteStateMachine* fsm;
все в порядке и проект полностью скомпилирован.
Теперь я хочу знать, почему это произошло? что здесь не так.
std::auto_ptr<>
генерирует код для вызова FiniteStateMachine
деструктор, и в вашем случае вы не предоставляете его, потому что вы предоставляете только путем подачи предварительной декларации.
Других решений пока нет …