0

我在尝试构建文件时收到以下链接器错误:

Application.obj : error LNK2001: unresolved external symbol "public: void __thiscall StateStack::registerState<class PauseState>(enum States::ID)" (??$registerState@VPauseState@@@StateStack@@QAEXW4ID@States@@@Z)
1>Application.obj : error LNK2001: unresolved external symbol "public: void __thiscall StateStack::registerState<class GameState>(enum States::ID)" (??$registerState@VGameState@@@StateStack@@QAEXW4ID@States@@@Z)
1>Application.obj : error LNK2001: unresolved external symbol "public: void __thiscall StateStack::registerState<class MenuState>(enum States::ID)" (??$registerState@VMenuState@@@StateStack@@QAEXW4ID@States@@@Z)
1>Application.obj : error LNK2001: unresolved external symbol "public: void __thiscall StateStack::registerState<class TitleState>(enum States::ID)" (??$registerState@VTitleState@@@StateStack@@QAEXW4ID@States@@@Z)
1>Application.obj : error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl toString<unsigned int>(unsigned int const &)" (??$toString@I@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABI@Z)
1>Application.obj : error LNK2001: unresolved external symbol "public: __thiscall State::Context::Context(class sf::RenderWindow &,class ResourceHolder<class sf::Texture,enum Textures::ID> &,class ResourceHolder<class sf::Font,enum Fonts::ID> &,class Player &)" (??0Context@State@@QAE@AAVRenderWindow@sf@@AAV?$ResourceHolder@VTexture@sf@@W4ID@Textures@@@@AAV?$ResourceHolder@VFont@sf@@W4ID@Fonts@@@@AAVPlayer@@@Z)
1>GameState.obj : error LNK2001: unresolved external symbol "protected: void __thiscall State::requestStackPush(enum States::ID)" (?requestStackPush@State@@IAEXW4ID@States@@@Z)
1>GameState.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall State::~State(void)" (??1State@@UAE@XZ)
1>GameState.obj : error LNK2001: unresolved external symbol "public: __thiscall State::State(class StateStack &,struct State::Context)" (??0State@@QAE@AAVStateStack@@UContext@0@@Z)
1>MenuState.obj : error LNK2001: unresolved external symbol "protected: struct State::Context __thiscall State::getContext(void)const " (?getContext@State@@IBE?AUContext@1@XZ)
1>MenuState.obj : error LNK2001: unresolved external symbol "protected: void __thiscall State::requestStackPop(void)" (?requestStackPop@State@@IAEXXZ)
1>PauseState.obj : error LNK2001: unresolved external symbol "protected: void __thiscall State::requestStateClear(void)" (?requestStateClear@State@@IAEXXZ)

我查看了 StateStack 的头文件和 cpp 文件,StateStack::registerState 方法确实在两个文件中:

#pragma once

#include <SFML/System/NonCopyable.hpp>
#include <SFML/System/Time.hpp>

#include "StateIdentifiers.hpp"
#include "State.hpp"
#include "Foreach.hpp"

#include <vector>
#include <map>
#include <functional>
#include <utility>
#include <assert.h>

class StateStack : private sf::NonCopyable
{
public:
    enum Action
    {
        Push,
        Pop,
        Clear,
    };
public:
    explicit StateStack(State::Context);
    template <typename T>
    void registerState(States::ID);

    void update(sf::Time);
    void draw();
    void handleEvent(const sf::Event&);

    void pushState(States::ID);
    void popState();
    void clearStates();

    bool isEmpty() const;

#include "StateStack.hpp"
#include "Foreach.hpp"

#include <cassert>


StateStack::StateStack(State::Context context)
: mStack()
, mPendingList()
, mContext(context)
, mFactories()
{
}

template <typename T>
void StateStack::registerState(States::ID stateID)
{
    mFactories[stateID] = [this] ()
    {
        return State::Ptr(new T(*this, mContext));
    };
}

这是 Application 调用 registerState 的地方:

#include "Application.hpp"
#include "Utility.hpp"
#include "State.hpp"
#include "StateIdentifiers.hpp"
#include "TitleState.hpp"
#include "GameState.hpp"
#include "MenuState.hpp"
#include "PauseState.hpp"


const sf::Time Application::timePerFrame = sf::seconds(1.f/60.f);

Application::Application()
: mWindow(sf::VideoMode(640, 480), "States", sf::Style::Close)
, mTextures()
, mFonts()
, mPlayer()
, mStateStack(State::Context(mWindow, mTextures, mFonts, mPlayer))
, mStatisticsText()
, mStatisticsUpdateTime()
, mStatisticsNumFrames(0)
{
    mWindow.setKeyRepeatEnabled(false);

    mFonts.load(Fonts::Main, "Media/Sansation.ttf");
    mTextures.load(Textures::TitleScreen, "Media/Textures/TitleScreen.png");

    mStatisticsText.setFont(mFonts.get(Fonts::Main));
    mStatisticsText.setPosition(5.f, 5.f);
    mStatisticsText.setCharacterSize(10u);

    registerStates();
    mStateStack.pushState(States::Title);
}


void Application::registerStates()
{
    mStateStack.registerState<TitleState>(States::Title);
    mStateStack.registerState<MenuState>(States::Menu);
    mStateStack.registerState<GameState>(States::Game);
    mStateStack.registerState<PauseState>(States::Pause);
}
4

0 回答 0