Problem with vector<T>.erase() with g++
The following code builds error free on msvc, but does not compile on g++.
if(*it == listener){
it = listeners.erase(it);
}
The error is in erase, The full code is:
void AguiListener::removeListener( AguiWidget* listener )
{
for(std::vector<AguiWidget*&开发者_如何学Pythongt;::const_iterator it = listeners.begin();
it != listeners.end(); ++it)
{
if(*it == listener){
it = listeners.erase(it);
}
}
}
and listeners is:
std::vector<AguiWidget*> listeners;
but g++ spits out loads of errors:
AguiListener.cpp:29: error: nomatching 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: typenamestd::vector<_Tp, _Alloc>::iteratorstd::vector<_Tp,_Alloc>::erase(__gnu_cxx::__normal_iterator<typenamestd::_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: typenamestd::vector<_Tp, _Alloc>::iteratorstd::vector<_Tp,_Alloc>::erase(__gnu_cxx::__normal_iterator<typenamestd::_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*>]
What could be wrong with this? Also, why would it work on msvc but not g++?
Thanks
In the current C++ standard (C++03), std::vector::erase takes an iterator, not a const_iterator.
In the forthcoming C++ standard (C++0x), std::vector::erase takes a const_iterator. The Visual C++ Standard Library implementation already supports this (at least it does in the latest version, Visual C++ 2010).
加载中,请稍侯......
精彩评论