【问题标题】:C++ no matching function for list::eraseC++ list::erase 没有匹配函数
【发布时间】:2016-09-03 15:57:43
【问题描述】:

我目前正在尝试循环浏览 char 类型的链接列表。当遇到一个参数时(如果它包含字母'w'),我尝试使用 list::erase 删除列表项。我只是希望收到一些关于使用这个函数的建议,我只看到了类型为 int 链接列表的示例,我不知道它是否不起作用,因为它是 char em> 还是什么原因。当我尝试编译以下代码时:

void filterFile(list <char> &myList)
{
    list<char>::const_iterator itr;

    for (itr = myList.begin(); itr != myList.end(); itr++ )
    { 
        if (*itr == 'w' || *itr == 'W'){
            itr = myList.erase (itr);
        }
    }
}

我收到编译错误:

错误:没有匹配函数调用‘std::__cxx11::list::erase(std::__cxx11::list::const_iterator&)’ itr = myList.erase (itr);

到目前为止,我所做的所有事情都是基于我在这里找到的 http://www.cplusplus.com/reference/list/list/erase/.

我还阅读了有关删除列表中项目的节点方法。我只是希望让这种方法发挥作用,因为它看起来更好,我很想知道我做错了什么。

【问题讨论】:

  • 迭代器不应该是 const
  • @Photon 不正确。 See the signature for erase
  • 我建议尝试使用常规迭代器而不是 const_iterator。我认为 const_iterator 应该可以工作,但值得一试看看是否是问题所在。
  • 你的编译器支持 c++11 吗?
  • 另外,当您执行erase 时,您仍然会点击itr++,这意味着如果您删除了最后一个元素,您会遍历它,而在其他情况下,您会错过检查连续的Ws . (cprference.com 比 cplusplus.com 可靠得多)

标签: c++ list linked-list iterator erase


【解决方案1】:

您使用的是 C++11 吗? std::list::erase 自 c++11 起仅支持const_iterators: http://en.cppreference.com/w/cpp/container/list/erase

【讨论】:

  • 谢谢汤姆。我确实将我的 const_interator 更改为 iterator 并且现在将编译并运行。感谢您的帮助:) 另外,当我在这里时,有人知道如何更改所列项目中的值。例如。 *itr = 'p' 之类的东西(在与上面相同的代码中,替换擦除行)。
  • @mark,如果你使用的是普通的iterator,而不是const_iterator
  • 谢谢我刚刚问了这个问题,因为我之前试图解决这个问题,但由于我将它从 const_iterator 更改为没有尝试过。谢谢你的帮助:)
【解决方案2】:

这是GCC 或更具体的 libstdc++ 中的一个错误,直到 4.9.0 才修复

C++11 要求的缺失重载:

iterator erase( const_iterator pos );

导致您的代码失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2021-09-21
    • 2016-11-23
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多