Я разрабатываю Visual Studio 2010, а затем компилирую версию Linux 64 на другой машине. Для того, чтобы покрыть разницу между 2 разными компиляторами/средами, мы условно включают заявления:g ++ unordered_map не имеет функции at()?
#ifdef __linux__
#include <tr1/unordered_map>
#endif
#ifdef _WIN32
#include <unordered_map>
#endif
using namespace std; // covers std::unordered_map
using namespace std::tr1; // covers tr/unordered_map
unordered_map<string,string> map;
Для unordered_map
, я использую эту документацию: cplusplus.com, который показывает в at()
метод для поиска ключа в карта. (В отличие от оператора []
, это не будет вставить ключ в карту, если не найден.)
Когда я попытался скомпилировать код на машине Linux, GCC выдает ошибку о том,
test_map.cpp:18: error: 'class std::tr1::unordered_map, std::allocator >, std::basic_string, std::allocator >, std::tr1::hash, std::allocator > >, std::equal_to, std::allocator > >, std::allocator, std::allocator >, std::basic_string, std::allocator > > >, false>' has no member named 'at'
от версии НКУ на этой машине:
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
Я попытался компиляции на более новую установку Linux с версией:
gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
и получил ту же ошибку.
Так мой вопрос имеет 2 части:
Есть работа вокруг, так что я по-прежнему можно использовать функцию
unordered_map.at()
?Где я могу найти документы API для Linux unordered_map так Я могу знать о любых других несоответствиях? (Я смотрел на GNU online docs, но я мог бы выяснить, где найти ссылку API, что показывает класс и функции.)
UPDATE
Я узнал многое из ответов, размещенных здесь, так что спасибо все. us2012's answer объяснил, как работать с проблемой компиляции, но в конце я переключился на использование boost::unordered_map
, как было предложено John Dibling. (Я решил серьезно отнестись к предупреждениям об экспериментальных C++ 11, а также не желая непреднамеренно принудительно настроить параметры компилятора на клиентах, которые используют нашу библиотеку.) Это дало мне чистую компиляцию как в Windows, так и в Windows Linux, и не требовалось изменение кода (кроме удаления ссылки на std
и tr1
). Также я переключился на использование сайта http://cppreference.com, который уже выпрямил меня и с другими проблемами. (Удивительно, но этот сайт никогда не появлялся ни в одном из моих поисков Google для документов C++ API.)
Еще раз спасибо за подробные объяснения каждого.
Не могу проверить это прямо сейчас, но я * думаю * в gcc 4.4.6 эти функции должны быть доступны через пространство имен 'std' вместо' tr1'. Попробуйте '#include' и удалите 'using namespace std :: tr1' - и обязательно скомпилируйте с помощью' -std = C++ 0x'. Независимо от того, что вы используете, использование пространства имен с помощью 'std' и' std :: tr1', похоже, вызывает проблемы. –
us2012
Оба «tr1» и GCC 4.4 (не говоря уже о 4.1) сейчас являются доисторическими. Я понимаю, что у вас, вероятно, нет большого выбора, но вы должны иметь в виду, что документ применяется к стандарту C++ 11, не обязательно к 'tr1'. Для записи GCC 4.4 - с 2009 года ... – syam
http://gcc.gnu.org/develop.html здесь. это действительно старый компилятор. –