【问题标题】:Compile error using map iterators使用映射迭代器编译错误
【发布时间】:2012-02-03 20:42:09
【问题描述】:

在我的头文件中,我包含了 std::map 并使用了适当的命名空间。
我的成员之一是:

map<unsigned int, double> pT_Spam;

在我的 .cpp 文件中,我尝试做一些我现在经常做的事情:

for(map<unsigned int, double>::iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++) {/*code*/}

在 cplusplus.com 上使用 std::map 的示例之一中甚至提到了上述内容。尽管我在代码的其他部分做了几乎相同的操作,不会导致编译错误,但在这一特定行上,我从 Cygwin 收到以下错误:

error: conversion from `std::_Rb_tree_const_iterator<std::pair<const unsigned int, double> >' to non-scalar type `std::_Rb_tree_iterator<std::pair<const unsigned int, double> >' requested

这似乎很奇怪。知道可能出了什么问题吗? (当然,我的标头包含在我的 .cpp 中)

【问题讨论】:

  • 抱怨 begin() 返回的迭代器是一个 const_iterator,但您将它分配给了一个迭代器。但我不知道为什么,这对我来说也很合适。这是什么编译器?
  • begin() 似乎也能够返回非常量迭代器。我在 windows 上使用 Cygwin 的 g++。

标签: c++ map iterator compiler-errors


【解决方案1】:

似乎在这个循环存在的范围内,映射是 const 的。例如,类方法中的循环是不是这样声明为 const 的?

void method() const // const method
{
    // Do stuff.
}

还是像这样作为 const 参数传递?

void function(const map<unsigned int, double>& pT_Spam)
{
    // Do stuff.
}

如果是,则必须使用 const 迭代器:

for(map<unsigned int, double>::const_iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++)
{
    /*code*/
}

或者,如果您使用的是 C++11,那么您应该使用 auto 关键字:

for(auto it=pT_Spam.begin() ; it!=pT_Spam.end(); it++)
{
    /*code*/
}

由于在您展示的情况下您必须使用 const 迭代器,因此您不能使用它们来修改地图或其中的数据。这是 const 的正确性,这是一件好事 :)。

【讨论】:

  • -.25 以杀死小猫的方式使用自动。 ;)
  • 另一种方法是将成员标记为mutable。但是不要告诉任何人我告诉过你的:-)
  • 运行循环的方法确实是 const,这让我明白为什么地图在它的范围内也是 const。考虑到我不需要在这种方法中编辑它,const 迭代器似乎是答案。
  • @Chet Simpson Herb Sutter 说我的小猫很安全 :)。
  • 在这种情况下 auto 会有什么问题?
【解决方案2】:

嗯,错误表明您正在尝试将 const_iterator 强制转换为迭代器。你说pT_Spam 是会员。它是 const 对象的成员吗?如果是,begin() 和 end() 将返回 const_iterators。

【讨论】:

  • 说实话,它是我的“nbclassifier”类的已声明私有成员,而执行循环的方法也是该类的成员。
  • 另一种方法是将成员标记为mutable。但是不要告诉任何人我告诉过你的:-)
  • Const 在某处出现。如果成员变量未声明为 const,并且方法未声明为 const,则可能正在对 const 对象调用该方法(这将使成员变量隐式为 const)。编译器错误是否带有调用堆栈?编辑:等等,如果在 const 对象上调用它,它必须是 const 方法。
  • 错误是在哪里说的?它说:请求从 GARBAGE 转换为非标量类型 LINE_NOISE。
【解决方案3】:

地图需要使用 const_iterators,所以应该是:

for(map<unsigned int, double>::const_iterator it = \\and so on

编辑:正如上面指出的那样,但出于完全错误的原因(地图有非常量迭代器。我到底在想什么?我不知道)。您的地图很可能被定义为 const (如另一个答案中所指出的那样)。

【讨论】:

  • 在改变它们的值(it++)时不会引起问题吗?另外,到目前为止,我一直在对类似的循环使用常规迭代器,从未遇到过问题。
  • 嗯,什么? map 有非常量迭代器。
  • @JohnAthanasiou:可变常量迭代器与常量非常量迭代器不同!想想T const * 与T * const。
  • John:const_iterators 本身不是 const,它们只是引用一个 const 对象。
【解决方案4】:

for(map::iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++)

改成

for(map::const_iterator it=pT_Spam.begin() ; it!=pT_Spam.end() ; it++)

因为它指向的是常量值,所以迭代器也必须是const类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多