gpt4 book ai didi

c++ - vector.erase() 与 g++ 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:27 25 4
gpt4 key购买 nike

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

谢谢

最佳答案

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

在即将发布的 C++ 标准 (C++0x) 中,std::vector::erase 采用了一个 const_iterator。 Visual C++ 标准库实现已经支持这一点(至少在最新版本 Visual C++ 2010 中支持)。

关于c++ - vector<T>.erase() 与 g++ 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4140877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com