Comment peut-on inclure TR1?
-
22-07-2019 - |
Question
Différents compilateurs semblent avoir des idées différentes sur TR1. G ++ ne semble accepter que des inclus de type:
#include <tr1/unordered_map>
#include <tr1/memory>
...
Alors que le compilateur Microsofts accepte uniquement:
#include <unordered_map>
#include <memory>
...
Pour autant que je sache TR1, la méthode Microsoft est la bonne.
Y at-il un moyen d’obtenir que G ++ accepte la deuxième version? Comment gère-t-on généralement TR1 de manière portable?
La solution
Installez boost sur votre ordinateur.
Ajoutez le répertoire suivant à votre chemin de recherche.
< Répertoire d'installation Boost > / boost / tr1 / tr1
voir ici boost tr1 pour plus de détails
Maintenant, lorsque vous incluez < memory > vous obtenez la version tr1 de la mémoire qui contient std :: tr1 :: shared_ptr, puis la version spécifique à la plate-forme de < memory > pour obtenir tous les goodies normaux.
Autres conseils
#ifdef _WIN32
#include <unordered_map>
#include <memory>
#else
#include <tr1/unordered_map>
#include <trl/memory>
#endif
Le meilleur moyen serait peut-être d'utiliser simplement les bibliothèques boost pour le moment, car dans de nombreux cas, ils ont interface similaire aux fonctionnalités TR1, et se trouvent juste dans un chemin d’en-tête et un espace de noms différents (mais cohérents). Cela présente l’avantage de travailler sur des compilateurs qui n'ont même pas commencé à implémenter C ++ 0x. Et il existe de nombreuses bibliothèques boost utiles qui ne figurent pas du tout dans TR1:
Sinon, sur G ++, vous pouvez essayer de passer --std = gnu ++ 0x sur la ligne de commande. Cela fonctionne pour & Lt; unordered_set & Gt; et < unordered_map > ;, au moins. Ensuite, pour le rendre disponible dans std :: tr1:
namespace std { namespace tr1 { using namespace std; } }
C'est mal, naturellement. Je recommande fortement l’approche boost à la place:)
Un peu malin, peut-être, mais vous pourriez simplement ajouter le répertoire tr1 du compilateur à votre chemin d'inclusion.
Si vous utilisez Windows, ajoutez le répertoire "tr1" au chemin du système. Ensuite, #include <memory>
devrait fonctionner.
Je me suis posé la même question. Malheureusement, le rapport technique ne dit pas comment inclure les en-têtes. Il définit uniquement que les extensions doivent être dans l'espace de noms :: std :: tr1.