我有一些代码可以在VS2008中工作,但不能在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));
}
Run Code Online (Sandbox Code Playgroud)
正如我上面提到的,它适用于VS2008,但不能用G ++编译,它给出错误:错误:没有匹配函数调用'IterateStateInfo(SNumItemsFunctor)'注意:候选者是:void IterateStateInfo(IIterationFunctor&)
显然,如果我定义一个局部变量,它的工作原理如下:
void SomeFunction()
{
uint8 nNumItems;
SNumItemsFunctor functor(nNumItems, 3));
IterateStateInfo(functor);
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法在没有局部变量的G ++(我假设C++扩展)中做到这一点?
问题是void IterateStateInfo( IIterationFunctor& functor )不允许接受匿名临时绑定到非const引用参数.g ++禁止它并且MSVC错误是正确的.你需要使该参数成为一个const引用,它应该工作.
| 归档时间: |
|
| 查看次数: |
542 次 |
| 最近记录: |