【问题标题】:C++ linux getting vector iterators incompatibleC++ linux获取向量迭代器不兼容
【发布时间】:2013-08-29 13:29:03
【问题描述】:

执行以下代码时,我不断收到“向量迭代器不兼容”:

Tag Som::UpdateAfterTagMessageExciter(string detectedTagID, unsigned char ReaderID, unsigned char antData, SSensors Sensors,bool staff, int BatLevel, int RSSI, int temperature)
{

        tagsIT = search (m_DetectedTags.begin(), m_DetectedTags.end(), searchTag,              
                             searchTag+1,TagCollection::SearchTagsCollByTagIDPredicate);

        if (tagsIT<m_DetectedTags.end())
        {
                 //do something
        }

SearchTagsCollByTagIDPredicate 如下:

static bool SearchTagsCollByTagIDPredicate (Tag i, string tagID) 
     {
        string secondTag=  i.GetTagID();
        return (tagID==secondTag);
      }

其中 m_DetectedTags 向量不在此块之外使用。 每次 LF 天线检测到标签时,都会重复调用该函数。 它发生在搜索调用中。 我试过调试,但无济于事。

我尝试用一​​个简单的 for 循环替换搜索,但它仍然不起作用。

任何想法为什么搜索导致错误? 谢谢!

【问题讨论】:

  • 您应该尝试将其减少到重现问题的最小代码示例。但该错误通常意味着您正在比较来自不同向量的迭代器。
  • 您是否遇到编译错误?如果有,在哪一行?
  • 否 - 没有出现编译错误。在运行时出现错误,而不是在运行代码时立即出现错误,而是在一段时间后。
  • 另外,你应该惩罚作者使用前导下划线,如果不是通过复制代码引入,可怕的格式。
  • @AdrianWillenbücher,下划线后跟大写字母是reserved name

标签: c++ vector runtime-error


【解决方案1】:

您的 SearchTagsCollByTagIDPredicate 函数是您在 TagCollection 类头文件中定义的 TagCollection 类的方法还是只是一个静态函数?从上下文中不清楚。可能这就是导致问题的原因。

【讨论】:

  • SearchTagsCollByTagIDPredicate 是 TagCollection 类的静态函数
  • 不会是同步问题吧?您是否在线程中更新 m_DetectedTags?
【解决方案2】:

没有太多的代码可以使用,所以我能看到的唯一不寻常的是以下内容:

  • 您正在使用&lt; 来比较迭代器。不知道这对于向量迭代器是否合法。但通常人们会写:

    if (tagsIT != _DetectedTags.end())

  • 您通过值而不是通过引用将参数传递给比较器函数。如果您的 Tag 的复制构造函数或析构函数有问题,那么您的问题可能就在那儿。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多