带有g ++ </t>的vector <t> .erase()问题

时间:2010-11-10 03:06:56

标签: c++ vector

以下代码在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 ++?

由于

1 个答案:

答案 0 :(得分:7)

在当前的C ++标准(C ++ 03)中,std::vector::erase需要iterator,而不是const_iterator

在即将推出的C ++标准(C ++ 0x)中,std::vector::erase需要const_iterator。 Visual C ++标准库实现已经支持此功能(至少在最新版本Visual C ++ 2010中支持)。