Как преобразовать карту‹int, string› из С++ 11 в С++ 98?

У меня есть этот код на С++ 11:

#include <string>
#include <map>
using namespace std;

map<int, string> finalStates =
{
    { 0, "eroare lexicala" },
    { 1,  "identificator" } 
};

И я попытался преобразовать его в С++ 98, например:

#include <string>
#include <map>

std::map<int, std::string> finalStates;

finalStates.insert( std::pair<int, std:string> (0, "eroare lexicala"));
finalStates.insert( std::pair<int, std:string> (1,  "identificator"));

что дает мне ошибку «finalStates» не называет тип |

Пожалуйста помоги.


person saratele    schedule 11.04.2020    source источник
comment
Код для вставки чего-либо в карту должен быть внутри функции. Это не может быть на уровне декларации. С++ так не работает.   -  person Sam Varshavchik    schedule 12.04.2020
comment
gives me the error 'finalStates' does not name a type Опубликуйте точное сообщение об ошибке. Вы пытались вызвать функцию finalStates.insert( в области файла?   -  person KamilCuk    schedule 12.04.2020


Ответы (3)


ошибка 'finalStates' не называет тип

В C++ у вас не может быть операторов во внешней (глобальной) области видимости. Вы должны поместить их в какую-то функцию. В коде C++11 нет оператора, только определение.

Альтернатива C++98 (особенно полезно, если карта должна быть const):

#include <string>
#include <map>

std::map<int, std::string> construct_final_states()
{
    std::map<int, std::string> finalStates;
    finalStates.insert( std::pair<int, std::string> (0, "eroare lexicala"));
    finalStates.insert( std::pair<int, std::string> (1,  "identificator"));
    return finalStates;
}

std::map<int, std::string> finalStates = construct_final_states();
person YSC    schedule 11.04.2020
comment
Мне было трудно не напечатать auto! - person YSC; 12.04.2020
comment
Это также мой предпочтительный способ инициализации таких карт. Можно также подумать о том, чтобы сделать эту функцию статической и поместить ее в анонимное пространство имен, поэтому она будет вызываться только внутри текущего модуля. - person Thomas Lang; 12.04.2020
comment
Вы можете просто вставить построенную по умолчанию строку с operator[] и присвоить ей вместо того, чтобы вводить тип пары: finalStates[0]="eroare lexicala"; finalStates[1]="identificator";. Это достаточно дешево (и дешевле, чем создание временного std::string и его копирование). - person Ruslan; 12.04.2020

Вне любой функции вы можете использовать только объявления.

Например, вы можете объявить вспомогательный массив, например

const std::pair<int, std::string> a[] = 
{
    std::pair<int, std::string>( 0, "eroare lexicala" ),
    std::pair<int, std::string>( 1, "identificator" )
};

а затем объявить карту

std::map<int, std::string> finalStates( a, a + sizeof( a ) / sizeof( *a ) );
person Vlad from Moscow    schedule 11.04.2020

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

#include <string>
#include <map>

std::map<int, std::string> finalStates;

class finalStates_init
{
public:
    finalStates_init()
    {
        finalStates.insert( std::pair<int, std:string> (0, "eroare lexicala"));
        finalStates.insert( std::pair<int, std:string> (1,  "identificator"));
    }
} the_finalStates_init;

Таким образом, карта будет иметь свои значения к моменту начала main(). Либо так, либо получите класс от map<int, string> и предоставьте конструктор.

person Seva Alekseyev    schedule 11.04.2020