Как конвертировать карту с с ++ 11 до с ++ 98? - PullRequest
0 голосов
/ 12 апреля 2020

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

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

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

И я попытался преобразовать его в C ++ 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 'не называет тип |

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

Ответы [ 3 ]

1 голос
/ 12 апреля 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 ) );
1 голос
/ 12 апреля 2020

ошибка '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();
0 голосов
/ 12 апреля 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> и предоставляет конструктор.

...