遍历地图时编译时出错

时间:2019-04-07 19:13:39

标签: c++ compiler-errors

尝试编译简单的cpp程序时出现编译错误

我尝试了以下编译行

1) gcc hello.cpp -std=gnu++11
2) g++ hello.cpp -std=gnu++11

这是我的cpp文件

#include <iostream>
#include <map>
#include <string>
using namespace std;
static map<string,int> create_map()
{
  map<string,int> mymap = {
                { "alpha", 10 },
                { "beta", 20 },
                { "gamma", 30 } };
  return mymap;
}
map<string,int> m=   create_map();   
int main() 
{
    cout << "Hello, World!";
    for (map<string,int> x: m) 
       cout << x.first << ": " << x.second << '\n';

    return 0;
}

gcc的输出包含很多链接错误,例如

hello.cpp:(.text+0x135): undefined reference to `std::cout'                             
hello.cpp:(.text+0x13a): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

和g ++输出较短

hello.cpp: In function 'int main()':
hello.cpp:19:29: error: conversion from 'std::pair<const std::basic_string<char>, int>' to non-scalar type 'std::map<std::basic_string<char>, int>' requested
hello.cpp:20:18: error: 'class std::map<std::basic_string<char>, int>' has no member named 'first'
hello.cpp:20:37: error: 'class std::map<std::basic_string<char>, int>' has no member named 'second'

此代码正确率为99.99%。我真的不知道如何正确编译

3 个答案:

答案 0 :(得分:3)

您会看到一些非常不同的错误。

gcc hello.cpp -std=gnu++11

这会尝试使用GNU c编译器编译代码。
可以根据c ++语法识别和编译C ++源文件,但是链接器使用c标准库,并且不会自动链接c ++标准库。

您的来源必须有所不同,因为我无法重现您使用此test声称的链接器错误。


在另一种情况下

 g++ hello.cpp -std=gnu++11

您的代码是使用c ++编译器编译的,并且

for (map<string,int> x: m)

关于基于范围的循环中的x的类型是错误的(实际上是pair<const string,int>)。

您只需将其更改为

for (const auto& x: m)

使代码正常工作。

x是容器 element 类型的类型,它是从m开始迭代的。

这是工作中的online demo

答案 1 :(得分:2)

将循环替换为:

for (auto const& x: m) 
   cout << x.first << ": " << x.second << '\n';

或者,您可以使用:

for (std::pair<string, int> x: m) 

for (const std::pair<string, int>& x: m) 

const,因为您不想更改x&,以防止将一对复制到x

std::map的基于范围的循环中,遍历容器的变量需要为std::pair<const Key, T>。由容器的Member typesvalue_type定义。

答案 2 :(得分:1)

由于x的类型为std::pair<const string,int>,因此您需要使用x(在注释之后):

for (const std::pair<const string,int>& x: m)
添加

const &是为了避免冗余的 pair 副本(在最新的编译器中,可能会以任何方式避免它们)。

for (const auto& x: m)

也可以使用!