Kein Typ mit dem Namen 'unique_ptr' in namespace 'std' beim kompilieren unter LLVM/Clang

Ich bin, fangen einen compile-Fehler, wenn Sie versuchen zu verwenden unique_ptr auf Apple-Plattformen mit -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>;

Laut Marshall Clow, die halte ich ein Experte auf dem C++ Standard-Bibliothek mit Clang und Apple:

Technical Report #1 (TR1) war ein Satz der Bibliothek Ergänzungen zu den C++03
standard. Repräsentieren Sie die Tatsache, dass Sie nicht Teil der
"offizielle" - standard, Sie wurden in den namespace std::tr1.

In c++11 sind Sie offiziell Teil des Standards, und Leben in den
namespace std, wie vector und string. Die include-Dateien nicht
mehr Leben in der "tr1" - Ordner, entweder.

Take-aways:

  • Apple und C++03 = TR1 namespace
  • Apple und C++11 = STD-namespace
  • Verwenden LIBCPP_VERSION zu erkennen libc++

Nun, hier ist, was ich in 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

Ich denke, das Letzte, was zu prüfen ist, die __APPLE__ definieren, und hier ist es:

$ 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

Warum erhalte ich eine error: no type named 'unique_ptr' in namespace 'std' bei der Verwendung -std=c++11?


Ich denke, das sind die vier Testfälle. Er versucht auszuüben, die den vier Konfigurationen aus dem Kreuzprodukt von: {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
    • SCHEITERN
  • c++ -std=c++11 -stdlib=libc++ -c-test-clapple.cxx
    • OK

Hier ist die test-Fahrer. Werden Sie sicher, testen Sie es auf OS X so erhalten Sie die vollen Auswirkungen der TR1-namespace in 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;
}
Es gibt keine std::tr1::auto_ptr auf jeder Plattform immer, dass ich bewusst bin.
My bad... ich erkannte, dass war ein Fehler, und es wurde geändert. Aber ich änderte es in der test-Fall, den ich gepostet. Lassen Sie mich zu aktualisieren.

InformationsquelleAutor jww | 2015-07-27

Schreibe einen Kommentar