2012-01-19 5 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이 유형이 될 것이라는 것을 모릅니다. 당신은 당신이 점점 오류를 제공하지 않기 때문에, 우리는 단지 추측 할 수

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

great thanx 작동해야합니다. :) 저는 typename 키워드를 사용하여 뭔가를 배웠습니다. 이 솔루션은 작동합니다 'std :: pair res = m_eventMap.insert (typename T_EventMap :: value_type (callTime, funcPtr)); ' – oiko

0

이 명확를 만들려면, typename 키워드를 사용합니다. 그리고 내 추측은 삽입 호출의 결과가 정확하지 않다는 것입니다.

this refernce에 따르면 std::map::insert의 반환 값은 std::pair<iterator, bool>입니다. 반복기가 int이라 확신합니까?

+0

죄송합니다. : 오류 : 템플릿 유형 매개 변수의 템플릿 인수는 유형이어야합니다 (예 : T_EventMap :: value_type (callTime, funcPtr)) : std :: pair res = m_eventMap.insert – oiko

관련 문제