[英]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”的参数列表丢失),但是我看到了以这种方式编写的示例。
您调用了变量map
并using namespace std;
当您使用变量和称为同一事物的库容器时,这将导致名称查找问题。 大卫在评论中及以下内容中对该部分进行了详细说明。
您可以做几件事(除了这些之外,您还可以做更多的事情):
使用std::
限定变量声明std::
std::map<string, int> map;
std::map<string, int>::iterator iter = map.begin();
删除using namespace std;
并使用std::
map
变量。 确实,您应该避免使用库定义的名称作为变量名。 编辑: 马克的答案也应该为您工作。
嗯,我想知道编译器是否会满意:
typedef map<string,int> MapType;
MapType myMap;
MapType::iterator iter = myMap.begin();
无论如何,我都倾向于这样做,因为它减少了DRY ,对我来说看起来更干净。
同样,变量名map
可能会使编译器感到困惑,并且至少会使人们阅读代码感到困惑,因此我将对其进行更改。
问题是您正在将map
定义为main
的变量。 所述定义本身是种确定,当所述类型被解析变量还没有被宣布,且map
在map<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.