2011-03-25 3 views
2

내가 VS2008에서가 아니라 같은 작동 G ++에서 작동하는 코드가 있습니다G ++의 익명 펑션?

struct IIterationFunctor 
{ 
    virtual bool operator()(SStateInfo& rStateInfo) = 0; 
    virtual ~IIterationFunctor() { } 
}; 

struct SNumItemsFunctor : public IIterationFunctor 
{ 
    SNumItemsFunctor (uint8& nNumItems, uint8 nItemType) 
     : m_nNumItems (nNumItems) 
     , m_nItemType (nItemType) 
    { 
     m_nNumItems = 0; 
    } 

    virtual bool operator() (SStateInfo& rStateInfo) 
    { 
     if(rStateInfo.sState.nItemType == m_nItemType) 
     { 
      ++m_nNumItems; 
     } 
     return true; 
    } 

    uint8& m_nNumItems; 
    uint8 m_nItemType 
}; 

void IterateStateInfo(IIterationFunctor& functor) 
{ 
    for (TStateInfoIterator itStateInfo = m_lstStateInfos.Begin(); 
     itStateInfo != m_lstStateInfos.End(); 
     itStateInfo++) 
    { 
     SStateInfo* pStateInfo = *itStateInfo; 

     // If a functor returns false don't continue processing 
     if(!functor(*pStateInfo)) 
     { 
      return; 
     } 
    } 
} 

void SomeFunction() 
{ 
    uint8 nNumItems; 
    IterateStateInfo(SNumItemsFunctor(nNumItems, 3)); 
} 

내가 위에서 언급 한 바와 같이이 VS2008와 잘 작동하지만 G ++ 컴파일하지 않습니다, 그것은 오류를 제공합니다 오류 : 노트 'IterateStateInfo (SNumItemsFunctor)'을 호출 일치 기능 : 후보는 : 나는 로컬 변수를 정의하면 무효 IterateStateInfo (IIterationFunctor &) 분명히

은은 작동하지 않습니다 :

void SomeFunction() 
{ 
    uint8 nNumItems; 
    SNumItemsFunctor functor(nNumItems, 3)); 
    IterateStateInfo(functor); 
} 
,

하지만 G ++에서 할 수있는 방법이 있습니까 (그리고 C++ 확장을 가정합니다). 로컬 변수가 없습니까?

답변

5

void IterateStateInfo(IIterationFunctor& functor)은 const가 아닌 참조 매개 변수에 바인딩하기 위해 익명 임시를 수락 할 수 없습니다. g ++는 그것을 허용하지 않고 MSVC가 잘못되었습니다. 해당 매개 변수를 const 참조로 만들어야하며 작동해야합니다.

+0

그게 전부입니다. 나는 최근에 이런 일이 일어났다는 것을 기억하고, 그때 내 실수를 깨달았습니다. 두 사람을 왜 연관시키지 않았는지 확신 할 수 없습니다. 감사! –

+1

@ Doug-W : [이 정확한 문제에 대한 질문에 대답했습니다.] (http://stackoverflow.com/questions/5126608/who-is-right-and-who-is-wrong-aka-gcc-vs-visual -studio/5126624 # 5126624). 컴파일러가 이러한 에러를 잡을 수 있도록'/ W4' (바람직하게는'/ W4'와'/ WX')로 컴파일 할 것을 권장합니다. –