繁体   English   中英

C ++映射迭代器问题

[英]C++ map iterator problem

为什么此代码有问题(在Visual Studio 2010中)?

#include <iostream>
#include <fstream>
#include <string>
#include <map>

using namespace std;

int main() {

    map<string,int> map;
    map<string,int>::iterator iter = map.begin();
}

它只是告诉我迭代器定义中存在问题(类模板“ std :: iterator”的参数列表丢失),但是我看到了以这种方式编写的示例。

您调用了变量mapusing namespace std; 当您使用变量和称为同一事物的库容器时,这将导致名称查找问题。 大卫在评论中及以下内容中对该部分进行了详细说明。

您可以做几件事(除了这些之外,您还可以做更多的事情):

  1. 使用std::限定变量声明std::

    std::map<string, int> map;

    std::map<string, int>::iterator iter = map.begin();

  2. 删除using namespace std; 并使用std::

  3. 重命名您的map变量。 确实,您应该避免使用库定义的名称作为变量名。

编辑: 马克的答案也应该为您工作。

嗯,我想知道编译器是否会满意:

typedef map<string,int> MapType;
MapType myMap;
MapType::iterator iter = myMap.begin();

无论如何,我都倾向于这样做,因为它减少了DRY ,对我来说看起来更干净。

同样,变量名map可能会使编译器感到困惑,并且至少会使人们阅读代码感到困惑,因此我将对其进行更改。

问题是您正在将map定义为main的变量。 所述定义本身是确定,当所述类型被解析变量还没有被宣布,且mapmap<string, int>被查找与公共查找规则,首先在函数内部,然后在封闭命名空间,然后由于using namespace std;而在using namespace std;空间( std )中using namespace std; 线。

在main的第一行中定义变量后,标识符map引用局部变量。 基本上,编译器会在map<string,int>::iterator看到map并进行查找。 它找到引用该变量的本地名称map ,并在此处停止查找。 然后,它会看到下一个预处理器令牌<并将其解析为小于运算符,然后找到string并将其错误提示。

您应始终牢记,对于不合格名称的C ++查找始于内部上下文,并从内部上下文中爬出,但是它将在您使用的标识符首次出现时停止。 您可以通过显式限定标识符来解决此问题,这也可以解决问题。 请注意,对于using namespace该语言的人来说, using namespace可能不是一个很好的提示。

using namespace std; // <- best remove this algothether
int main() {
   map<string, int> map;
   std::map<string, int>::iterator it = map.begin(); // [1]
}

在此修改后的版本中,通过在map之前添加限定std:: ,来提示编译器您不希望当前上下文中的map变量,而是来自std名称空间的map标识符。 这将是更好,如果你删除的using完全:

int main() {
   std::map<std::string, int> map;
   std::map<std::string, int>::iterator it = map.begin();
}

为变量选择更合理的名称可能有助于避免此类问题。

尝试将变量名从“ map”更改为“ m”,也许会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM