Ошибка компоновщика - не уверен, что он не связывает - PullRequest
0 голосов
/ 08 сентября 2018

Я пытался выяснить, что не связано или не объявлено правильно в моем коде. Я пишу простой игровой движок на C ++ для учебных целей и пытаюсь создать конечный автомат. Ошибка компоновщика связана с unordered_list, list или map. Я не уверен, какой. Ошибка для конструктора с двумя аргументами, которые являются двумя typedefs и включена в код, который я показываю, ошибка происходит, когда я вызываю этот конструктор.

IState.h

#ifndef ZX_STATE_H
#define ZX_STATE_H

#include "coreDefines.h"
#include "zxstring.h"
ZX_NS_START

class IState
{
    tstring pm_name;
public:
    const tstring& name();
    virtual ~IState() = default;
    virtual void Pre() = 0;
    virtual void Run() = 0;
    virtual void Post() = 0;
};

ZX_NS_END
#endif

IStateMachine.h

#ifndef ZX_ISTATEMACHINE_H
#define ZX_ISTATEMACHINE_H
#include "object.h"
#include "zxstring.h"
#include "IState.h"
#include <unordered_set>
#include <map>
#include <list>

ZX_NS_START
typedef std::map<tstring, IState*> StateMap;
typedef std::unordered_set<tstring> StateSet;
typedef std::list<StateSet> RunOrder;
class IStateMachine : object, IState
{
public:
    const tstring defaultState = T("zx default state");

    IStateMachine();
    IStateMachine(RunOrder** runOrder, StateSet** states);
    virtual ~IStateMachine();
    void Add(IState* state);
    void Remove(IState* state);

private:
    StateMap pm_states;
    RunOrder** pm_runOrder;
    StateSet** pm_activeStates;

    void Pre() override;
    void Run() override;
    void Post() override;

    void SetUpDefaultState();
    class DefaultState: IState
    {
        IStateMachine* pm_parent;
    public:
        DefaultState();
        explicit DefaultState(IStateMachine* parent);
        void Pre() override;
        void Run() override;
        void Post() override;
    };
};

ZX_NS_END
#endif

IStateMachine.cpp

#include "IStateMachine.h"
USINGZX;

IStateMachine::IStateMachine(): pm_states(StateMap()), pm_runOrder(nullptr), pm_activeStates(nullptr)
{
    SetUpDefaultState();
}

IStateMachine::IStateMachine(RunOrder** runOrder, StateSet** states) : pm_states(StateMap()), pm_runOrder(runOrder), pm_activeStates(states)
{
    SetUpDefaultState();
}

IStateMachine::~IStateMachine()
{
    delete pm_states[defaultState];
}


void IStateMachine::Add(IState* state)
{
    pm_states.insert(std::make_pair(state->name(), state));
}

void IStateMachine::Remove(IState* state)
{
    pm_states.erase(state->name());
}


void IStateMachine::Pre()
{
    pm_states[defaultState]->Pre();
}

void IStateMachine::Run()
{
    pm_states[defaultState]->Run();
}

void IStateMachine::Post()
{
    pm_states[defaultState]->Post();
}

void IStateMachine::SetUpDefaultState()
{
    DefaultState* def = new DefaultState(this);
    pm_states.insert(std::make_pair(defaultState, (IState*)def));
}

IStateMachine::DefaultState::DefaultState() :pm_parent(nullptr)
{
}

IStateMachine::DefaultState::DefaultState(IStateMachine* parent): pm_parent(parent)
{
}

void IStateMachine::DefaultState::Pre()
{
    for(const auto& states : **pm_parent->pm_runOrder)
    {
        for(const auto& runState : states)
        {
            pm_parent->pm_states[runState]->Pre();
        }
    }
}

void IStateMachine::DefaultState::Run()
{
    for(const auto& states: **pm_parent->pm_runOrder)
    {
        for(const auto& runState : states)
        {
            pm_parent->pm_states[runState]->Run();
        }
    }
}

void IStateMachine::DefaultState::Post()
{
    for (const auto& states : **pm_parent->pm_runOrder)
    {
        for (const auto& runState : states)
        {
            pm_parent->pm_states[runState]->Post();
        }
    }
}

Вот сообщение об ошибке long ... looong

Ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Zx :: IStateMachine :: IStateMachine (класс std :: list, класс std :: allocator>, struct std :: hash, класс std :: allocator>>, struct std: : equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>>>, класс std :: allocator, класс std :: allocator>, структура std :: hash, класс std :: allocator >>, структура std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>>>>> * *, класс std :: unordered_set, класс std :: allocator>, struct std :: hash, класс std :: allocator>>, структура std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>>> * *) "(?? 0IStateMachine @ Zx @@ QAE @ PAPAV? $ список @ V? $ unordered_set @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@ U? $ хэш @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ U? $ equal_to @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V ? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ V? $ распределитель @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @@ станд @@ V? $ Распределитель @ V? $ Unordered_set @ V? $ Basic_string @ _WU? $ Char_traits @ _W @ станд @@ V? $ Распределитель @ _W @ 2 @@ станд @@ U? $ хэш @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ U? $ equal_to @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ V? $ распределитель @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @@ станд @@@ 2 @@ станд @@ PAPAV? $ unordered_set @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @ @ станд @@ U? $ хэш @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ U? $ equal_to @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределителя @ _W @ 2 @@ станда @@@ 2 @ V? $ распределитель @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределителя @ _W @ 2 @@ std @@@ 2 @@ 3 @@ Z) ссылка на функцию "public: __thiscall TestStateMachine :: TestStateMachine (класс std :: list, класс std :: allocator>, структура std :: hash, класс std :: allocator>>, структура std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>>>, класс std :: allocator, класс std :: allocator>, struct s td :: hash, класс std :: allocator>>, структура std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>>>>> * *, класс std :: unordered_set, класс std :: allocator>, struct std :: hash, класс std :: allocator>>, struct std :: equal_to, класс std :: allocator>>, класс std :: allocator, класс std :: allocator>> > * *) "(?? 0TestStateMachine @@ QAE @ PAPAV? $ List @ V? $ Unordered_set @ V? $ Basic_string @ _WU? $ Char_traits @ _W @ std @@ V? $ Allocator @ _W @ 2 @@ std @ @U? $ хэш @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ U? $ equal_to @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ V? $ распределитель @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @@ станд @@ V? $ распределитель @ V? $ unordered_set @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @ @U? $ хэш @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ U? $ equal_to @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ V? $ распределитель @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ все ocator @ _W @ 2 @@ станд @@@ 2 @@ станд @@@ 2 @@ станд @@ PAPAV? $ unordered_set @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ Распределитель @ _W @ 2 @@ станд @@ U? $ хэш @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ U? $ equal_to @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V? $ распределитель @ _W @ 2 @@ станд @@@ 2 @ V? $ распределитель @ V? $ basic_string @ _WU? $ char_traits @ _W @ станд @@ V ? $ распределитель @ _W @ 2 @@ станд @@@ 2 @@ 2 @@ Z) * ​​1014 *

Обычно я могу понять это довольно легко, но по какой-либо причине этот вопрос ставит меня в тупик (возможно, что-то связанное с нечитаемым типом в сообщении об ошибке)

Я не верю, что это будет иметь какое-либо значение, однако вот тестовый код, который вызывает ошибку компоновщика

StateMachineTest.cpp

class TestStateMachine : zx IStateMachine
{
public:
    TestStateMachine(zx RunOrder** order, zx StateSet** active) : zx IStateMachine(order, active)
    {

    }
};

TEST_CLASS(StateMachineTest)
{
public:
    TEST_METHOD(IStateMachineTest)
    {
        auto* order = new zx RunOrder();
        auto* active = new zx StateSet();



        TestStateMachine test = TestStateMachine(&order, &active);
    }

};

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Я удалил все ваши макросы и #include s с отсутствующими заголовочными файлами, предоставил замену для tstring как typedef std::basic_string<TCHAR> tstring; и реализацию для const tstring& IState::name() { return pm_name; }, и код компилируется без ошибок.

0 голосов
/ 08 сентября 2018

Предполагая, что USINGZX равно using namespace zx;, этот код не определяет IStateMachine::IStateMachine в пространстве имен zx, он находится в глобальном пространстве имен.

USINGZX;

IStateMachine::IStateMachine(): pm_states(StateMap()), pm_runOrder(nullptr), pm_activeStates(nullptr)
{
    SetUpDefaultState();
}

Если вы хотите определить IStateMachine::IStateMachine в пространстве имен zx, то вы должны либо сказать

zx::IStateMachine::IStateMachine(): pm_states(StateMap()), pm_runOrder(nullptr), pm_activeStates(nullptr)
{
    SetUpDefaultState();
}

или

namespace zx {

IStateMachine::IStateMachine(): pm_states(StateMap()), pm_runOrder(nullptr), pm_activeStates(nullptr)
{
    SetUpDefaultState();
}

}
...