À l'aide de c++11 unordered_map types sur mac os x
Je suis sur MAC OS X 10.8.4 et ont installé gcc par le téléchargement de XCode et les outils de ligne de commande package. Voici mon gcc:
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Je suis en train d'utiliser la nouvelle unordered_map de la tr1 espace de noms:
using namespace std;
#include <tr1/unordered_map>
template<class T>
class A
{
tr1::unordered_map<T, int> * mymap;
.....
//key is of type T and value is of type int
mymap->at(key) = value;
}
Cependant, la ligne où je suis accéder à l'élément de la carte à l'aide de at
n'est pas la compilation. J'obtiens l'erreur suivante:
error: 'class std::tr1::unordered_map<int, int, std::tr1::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, int> >, false>' has no member named 'at'
Je ne comprends pas très bien ce depuis le C++ de référence inclut une fonction appelée at
d'accéder aux différents éléments de la carte. J'ai essayé de regarder dans les fichiers d'en-tête contenant la carte de la déclaration (sur mon système, c'est à /usr/include/c++/4.2.1/tr1/unordered_map
) et assez étonnamment, il ne contient pas un membre nommé at
.
Je comprends que les compilateurs plus âgés pourraient ne pas être le soutien à de nouvelles c++11 bibliothèques dans le std
espace de noms, mais j'ai été en mesure d'utiliser certaines des nouvelles bibliothèques de tr1
espace de noms. En fait, je peux utiliser d'autres fonctions de unordered_map
comme find
, insert
etc. Seul le membre at
est manquant.
Comment puis-je obtenir ce compilé? Dois-je mettre à niveau vers un nouveau compilateur? Je ne vois pas les nouveaux compilateurs disponibles pour mac os x facilement. Dois-je construire à partir de zéro?
OriginalL'auteur Venkat | 2013-08-31
Vous devez vous connecter pour publier un commentaire.
Votre version de gcc est trop faible. D'ailleurs, peut-être que vous devez installer clang plutôt car Apple est la force derrière elle.
Lorsque vous avez mis à niveau vers la dernière version, vous ne devez pas utiliser
tr1
plus.tr1
est le projet de C++11 et est obsolète maintenant.OriginalL'auteur Siyuan Ren
1)
unordered_map
est une forme demap
containter, utilisezunordered_map::find(KeyType key)
au lieu de cela, ce qui renvoieunordered_map::iterator
, essentiellement pointeur versstd::pair< KeyType, ValueType >
.Ou vous pouvez utiliser
unordered_map::operator[](KeyType key)
pour accéder à l'élément pointé par lakey
variable. Notez qu'il permettra de créer un nouvel élément dans le cas où il n'existe pas encore.Voir cppreference.com pour plus d'info.
2) l'Utilisation plus récente de GCC (au moins 4.7) avec
-std=c++11
option, et vous obtiendrez normaliséstd::unordered_map
au lieu detr1::unordered_map
OriginalL'auteur Erbureth