2012-01-19 4 views
0

こんにちは私はXCode、gcc(Apple LLVMコンパイラ3.0)でクラスをコンパイルするのに問題があります 私はクラスContextScheduleを書きました。これは他のクラスメンバ関数のリストをカプセル化し、 MSVC++ 2005の下でそれをコンパイルする。テンプレートパラメータのクラスメンバ関数へのポインタ

template<class T> 
class C_ContextScheduler 
{ 
public: 
    typedef void (T::*T_EventFunc)(); 
    typedef std::map<u64, T_EventFunc> T_EventMap; 

public: 
    //@ c-tor 
    C_ContextScheduler(T & context) : m_Context(context), m_currentTick(0) {}; 

    //@ Schedule 
    //@ funcPtr - pointer to function of class T 
    //@ dellayTime in milliseconds - after dellayTime from now will be funcPtr called 
    void Schedule(T_EventFunc funcPtr, u32 dellayTime) 
    { 
     u64 callingTime = m_currentTick + dellayTime; 
     std::pair<int, bool> res = m_eventMap.insert(T_EventMap::value_type(callingTime, funcPtr)); 
     SC_ASSERT(res.second); 
    } ... 

アイデア?このソリューションのテンプレート方法を維持したいと思っています。

+0

正確に表示されるエラーメッセージは何ですか? –

+0

あなたは "問題がある"と言いますが、あなたは*何*問題かは言いません。 – sth

+0

テンプレートタイプのパラメータのテンプレート引数は、タイプが – oiko

答えて

2

コンパイラがこのテンプレートをコンパイルすると、Tはまだわかりません。したがって、正確なタイプのT_EventFuncT_EventMapも未知であり、コンパイラはT_EventMap::value_typeがタイプになることを知りません。これを明確にするために、typenameキーワードを使用します。あなたが取得しているエラーを供給していないので

... = m_eventMap.insert(typename T_EventMap::value_type(callingTime, funcPtr)); 
+0

でなければなりません。これはうまくいきます:)私はtypenameキーワードで何かを考えています。この解決策は動作します 'std :: pair res = m_eventMap.insert(typename T_EventMap :: value_type(callTime、funcPtr));' – oiko

0

を、私たちは推測することができます。そして、私の推測では、あなたの挿入呼び出しの結果が正しくないということです。

this refernceによると、戻り値std::map::insertstd::pair<iterator, bool>です。イテレータがintであることを確認してください。

+0

私はテスト版をコピーしました。 : std :: pair res = m_eventMap.insert(T_EventMap :: value_type(callTime、funcPtr)); エラー: テンプレート型パラメータのテンプレート引数は型でなければならない – oiko

関連する問題