以下代码在msvc上构建无错误,但不在g ++上编译。
if(*it == listener){
it = listeners.erase(it);
}
错误是擦除, 完整的代码是:
void AguiListener::removeListener( AguiWidget* listener )
{
for(std::vector<AguiWidget*>::const_iterator it = listeners.begin();
it != listeners.end(); ++it)
{
if(*it == listener){
it = listeners.erase(it);
}
}
}
和听众是:
std::vector<AguiWidget*> listeners;
但g ++会出现大量错误:
AguiListener.cpp:29: error: no
matching function for call to
‘std::vector<AguiWidget*,
std::allocator<AguiWidget*>
>::erase(__gnu_cxx::__normal_iterator<AguiWidget*
const*, std::vector<AguiWidget*,
std::allocator<AguiWidget*> > >&)’
/usr/include/c++/4.2.1/bits/vector.tcc:109:
note: candidates are: typename
std::vector<_Tp, _Alloc>::iterator
std::vector<_Tp,
_Alloc>::erase(__gnu_cxx::__normal_iterator<typename
std::_Vector_base<_Tp,
_Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >) [with _Tp
= AguiWidget*, _Alloc = std::allocator<AguiWidget*>]
/usr/include/c++/4.2.1/bits/vector.tcc:121:
note: typename
std::vector<_Tp, _Alloc>::iterator
std::vector<_Tp,
_Alloc>::erase(__gnu_cxx::__normal_iterator<typename
std::_Vector_base<_Tp,
_Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >,
__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp,
_Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >) [with _Tp
= AguiWidget*, _Alloc = std::allocator<AguiWidget*>]
这可能有什么问题?另外,为什么它会在msvc上运行而不是g ++?
由于
答案 0 :(得分:7)
在当前的C ++标准(C ++ 03)中,std::vector::erase
需要iterator
,而不是const_iterator
。
在即将推出的C ++标准(C ++ 0x)中,std::vector::erase
需要const_iterator
。 Visual C ++标准库实现已经支持此功能(至少在最新版本Visual C ++ 2010中支持)。