Aucun type nommé "unique" dans l'espace de noms 'std' lors de la compilation sous LLVM/Clang

Je suis attraper une erreur de compilation lors de la tentative d'utilisation unique_ptr sur les plateformes Apple avec -std=c++11:

$ make
c++ -std=c++11 -DNDEBUG -g2 -O3 -fPIC -march=native -Wall -Wextra -pipe -c 3way.cpp
In file included ...
./smartptr.h:23:27: error: no type named 'unique_ptr' in namespace 'std'
    using auto_ptr = std::unique_ptr<T>;
                     ~~~~~^
./smartptr.h:23:37: error: expected ';' after alias declaration
    using auto_ptr = std::unique_ptr<T>;

Selon Marshall Clow, qui je considère comme un expert sur le C++ de la Bibliothèque Standard avec Clang et Apple:

Rapport technique no 1 (TR1) est un ensemble de bibliothèque ajouts du C++03
standard. Représentant le fait qu'ils ne faisaient pas partie de la
"officiel" de la norme, ils ont été placés dans l'espace de noms std::tr1.

En c++11, ils sont officiellement partie de la norme, et de vivre dans la
l'espace de noms std, tout comme vecteur et de la chaîne. Les fichiers d'en-no
plus vivre dans le "tr1" le dossier, soit.

La vente à emporter:

  • Apple et C++03 = utiliser TR1 espace de noms
  • Apple et C++11 = utiliser l'espace de noms STD
  • Utilisation LIBCPP_VERSION pour détecter libc++

Maintenant, voici ce que j'ai dans smartptr.h:

#include <memory>

//Manage auto_ptr warnings and deprecation in C++11
//Microsoft added template aliases to VS2015
#if (__cplusplus >= 201103L) || (_MSC_VER >= 1900)
  template<typename T>
    using auto_ptr = std::unique_ptr<T>;
#else
  using std::auto_ptr;
#endif //C++11

Je pense que la dernière chose à vérifier est les __APPLE__ définir, et c'est ici:

$ c++ -x c++ -dM -E - < /dev/null | grep -i apple
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __VERSION__ "4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)"
#define __apple_build_version__ 5030040

Pourquoi reçois-je un error: no type named 'unique_ptr' in namespace 'std' lors de l'utilisation de -std=c++11?


Je pense que ce sont les quatre cas de test. Il tente d'exercer les quatre configurations de la croix de produits de: {C++03,C++11} x {libc++,libstdc++}.

  • c++ -c test-clapple.cxx
    • OK
  • c++ -stdlib=libc++ -c test-clapple.cxx
    • OK
  • c++ -std=c++11 -c test-clapple.cxx
    • ÉCHOUER
  • c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx
    • OK

Ici est le pilote d'essai. Assurez-vous de le tester sur OS X de sorte que vous obtenez le plein des effets de la TR1 espace de noms en 2015.

$ cat test-clapple.cxx

//c++ -c test-clapple.cxx
//c++ -stdlib=libc++ -c test-clapple.cxx
//c++ -std=c++11 -c test-clapple.cxx
//c++ -std=c++11 -stdlib=libc++ -c test-clapple.cxx

#include <memory>

//Manage auto_ptr warnings and deprecation in C++11
#if (__cplusplus >= 201103L) || (_MSC_VER >= 1900)
  template<typename T>
    using auto_ptr = std::unique_ptr<T>;
#else
    using std::auto_ptr;
#endif //C++11

int main(int argc, char* argv[])
{
    return argc;
}
  • Il n'y a pas de std::tr1::auto_ptr sur toute plate-forme jamais que je suis au courant.
  • Oups... j'ai réalisé que c'était une erreur, et il a été changé. Mais j'ai seulement changé dans le cas de test que j'ai posté. Permettez-moi de le mettre à jour.
InformationsquelleAutor jww | 2015-07-27