получил ошибку компиляции при попытке скомпилировать простую программу 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%. я не знаю, как его правильно скомпилировать
Замените цикл на:
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>
. Это определяется value_type
для контейнера Типы членов.
Вы видите очень разные ошибки.
gcc hello.cpp -std=gnu++11
Это пытается скомпилировать код с помощью c-компилятора GNU.
Исходные файлы C++ распознаются и компилируются в соответствии с синтаксисом C++, но компоновщик использует стандартные библиотеки C, а стандартные библиотеки C++ автоматически не компонуются.
Должна быть какая-то разница с вашим источником, так как я не могу воспроизвести ошибки компоновщика, о которых вы заявляете, с помощью этого тестовое задание.
В другом случае
g++ hello.cpp -std=gnu++11
ваш код скомпилирован с помощью компилятора С++, и
for (map<string,int> x: m)
неверно относительно типа для x
в цикле на основе диапазона (который на самом деле является pair<const string,int>
).
Вы должны просто изменить это на
for (const auto& x: m)
чтобы код работал.
x
будет типом контейнера типа элемент, который повторяется из m
.
Вот рабочий файл онлайн демо.
@YonatanAmir Зачем тебе это? Но вы должны добавить явный флаг для связи с библиотекой -lstdc++
.
Поскольку тип x равен std::pair<const string,int>
, вам нужно использовать вместо этого (после комментариев):
for (const std::pair<const string,int>& x: m)
const &
добавлен, чтобы избежать избыточных копий пара (в новейших компиляторах их, вероятно, избегают каким-либо образом).
for (const auto& x: m)
можно использовать в качестве альтернативы!
auto
легче запомнить.
Однако приводит к забыванию соответствующих базовых типов.
Но правильный тип std::pair<const string,int>
Вы знаете, какой флаг я должен добавить, чтобы использовать gcc?