Ошибки с unordered_map в C ++? - PullRequest
       50

Ошибки с unordered_map в C ++?

3 голосов
/ 29 января 2012

Я писал программу для класса с использованием Visual C ++ на своем домашнем компьютере, однако я попытался запустить ее на компьютерах школьного Linux и получаю эти ошибки.

std::tr1::unordered_map <string, Word*> map;

Обе эти ошибки появляются в строке кода выше

ISO C ++ запрещает объявление "unordered_map" без типа

ожидается ‘;’ до ‘<’ токен </p>

Первоначально я использовал hash_map, но обнаружил, что можно использовать только в Visual C ++

Спасибо

1 Ответ

3 голосов
/ 29 января 2012

GCC и MSVC определяют расширения TR1 по-разному, потому что стандарт TR1 неопределен в отношении того, как он должен быть предоставлен пользователю.Он просто указывает, что должен быть какой-то параметр компилятора для активации TR1.

В отличие от MSVC, GCC помещает заголовки в подкаталог TR1.Есть два способа получить к ним доступ:

  1. Добавить параметр командной строки -isystem /usr/include/c++/<GCC version>/tr1.Это более согласованно, но, по-видимому, вызывает проблемы.
  2. Использовать условную компиляцию:

    #ifdef __GNUC__
    #include <tr1/unordered_map>
    #else
    #include <unordered_map>
    #endif
    

    Это выявляет несоответствие GCC: TR1 не активируется путем установки параметра, а вместо этого путем изменениякод.

    Существует несколько эзотерический способ обойти это: вычисляемые имена заголовков.

    #ifdef __GNUC__
    #define TR1_HEADER(x) <tr1/x>
    #else
    #define TR1_HEADER(x) <x>
    #endif
    
    #include TR1_HEADER(unordered_map)
    

    Таким образом, вы должны включать вещи только "один раз".

...