尝试编译简单的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%。我真的不知道如何正确编译
答案 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 types的value_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)
也可以使用!