ошибка компиляции при цикле по карте - PullRequest
0 голосов
/ 07 апреля 2019

получена ошибка компиляции при попытке скомпилировать простую программу 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 ]

3 голосов
/ 07 апреля 2019

Вы видите очень разные виды ошибок.

gcc hello.cpp -std=gnu++11

Это пытается скомпилировать код с использованием GNU c-компилятора.
Распознаются исходные файлы C ++и скомпилирован с учетом синтаксиса c ++, но компоновщик использует стандартные библиотеки c, а стандартные библиотеки c ++ не связаны автоматически.

Должен быть некоторый различие с вашим источником, так как я не могу воспроизвести ошибки компоновщикавы утверждаете с этим тестом .


В другом случае

 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 type, который повторяется с m.

Вот рабочая онлайн-демонстрация .

2 голосов
/ 07 апреля 2019

Замените цикл на:

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 для контейнера Типы элементов .

1 голос
/ 07 апреля 2019

Поскольку тип x равен std::pair<const string,int>, вместо него нужно использовать (после комментариев):

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

const & добавлено, чтобы избежать избыточных пар копий (в новейших компиляторах их, вероятно, избегают в любом случае).

for (const auto& x: m)

может использоваться альтернативно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...