2012-11-28 39 views
1

對於即將在1月份開始的課程,我開始開發一個小型DirectX引擎。要想知道是否有性能提升,我想盡量不要使用任何虛擬機(我知道虛擬機並不全是壞的,但我只是想看看沒有它們是否可能)。模板化的部分應用程序調用問題

當我開始用一個簡單的StateManager玩耍,它得到了難以避免的虛函數,但是這是我目前的做法:

#include <boost\function.hpp> 
#include <boost\bind.hpp> 

template <class Derived> 
struct TBaseState { 
    bool update(float delta) { 
    return static_cast<Derived *>(this)->update(delta); 
    }; 
}; 

struct CTestState : TBaseState<CTestState> { 
    bool update(float delta) { 
     return true; 
    } 
}; 

class StateManager 
{ 
public: 
    template <class StateClass> static void setState(StateClass nextState) 
    { 
     m_funcptrUpdate = boost::bind(&TBaseState<StateClass>::update,  boost::ref(nextState), _1); 
    } 
    static bool update(float delta) 
    { 
     return m_funcptrUpdate(delta); 
    } 
protected: 
private: 
    static boost::function<bool (float)> m_funcptrUpdate; 
}; 

Visual Studio 2010中的智能感知似乎覺得一切都很好,但是當我想編譯程序,並用一個非常基本的方法測試該StateManager:

CTestState* t = new CTestState(); 
StateManager::setState(*t); 
StateManager::update(0.0f); 

期間鏈接階段以下引發錯誤:

error LNK2001: unresolved external symbol "private: static class boost::function<bool __cdecl(float)> StateManager::m_funcptrUpdate" ([email protected]@@[email protected][email protected]@[email protected]@A) 

所以顯然他找不到綁定的函數,但我該如何解決這個問題?如果我直接對某些類使用boost :: bind,會得到類似的錯誤。因爲我是一名計算機科學專業的學生,​​所以我也會對一些洞察力或方法感興趣,而不需要提升(例如bind1st,...)。

編輯: 我也在考慮使用C++ 11 Variadic Templates,但其中一個課程要求是堅持VS2012。

回答

1

靜態類成員需要存儲。他們就像extern變量。一個定義添加到您的.cpp文件中的一個,類定義之外:

boost::function<bool (float)> StateManager::m_funcptrUpdate; 

而且,在此代碼:

template <class StateClass> static void setState(StateClass nextState) 
{ 
    m_funcptrUpdate = boost::bind(&TBaseState<StateClass>::update, 
     boost::ref(nextState), _1); 
} 

你保持存儲到本地變量nextState參考。 setState返回後,該參考將無效。

+0

感謝,改變了setState來接受一個指針,並將靜態初始化添加到cpp中,現在完美地工作(沒有期待那個快速的答案,我會在4分鐘內接受你的答案,當我被允許時) – niktehpui