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 erkennenlibc++
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;
}
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein haben Sie nicht. Sie sagten Ihnen, dass Sie etwas ähnliches tun, wenn Sie verwenden möchten
shared_ptr
, weil für C++03<tr1/memory>
definiertstd::tr1::shared_ptr
und für C++11<memory>
definiertstd::shared_ptr
.Aber Sie sind nicht mit
shared_ptr
. Wenn Sie verwenden möchtenauto_ptr
dann ist es nurstd::auto_ptr
überall, das ist immer definiert in<memory>
.Ich glaube, du hast missverstanden Marshall ' s Kommentar und du bist overcomplicating Dinge. Was du zitiert hast ('In c++11 sind Sie offiziell Teil des Standards, und Leben im namespace std, wie vector und string. Die include-Dateien nicht mehr live in der "tr1" - Ordner, entweder.') ist nicht Apple-spezifisch oder Clang-spezifisch, es gilt für alle Compiler. Aber da
auto_ptr
war nie ein Teil von TR1 und nie in<tr1/memory>
es ist unerheblich, dass der Inhalt der TR1 sind nun im namespacestd
, weil das, was Sie versuchen zu verwenden, wurde nie aufgenommen in TR1.Sollten Sie nicht verwenden TR1 an alle hier.
Sollte dies richtig sein, für moderne Compiler, aber nicht auf die dumm-Konfiguration kommt mit XCode, die eine moderne version von Clang unterstützt C++11 und die libstdc++ von GCC-4.2, die ist fast zehn Jahre alt ist und nicht unterstützt
unique_ptr
.Fertig zu werden mit der Standard-OS X-toolchain das funktioniert:
Diese arbeitet mit der Anwesenheit von
<forward_list>
als Indikator dafür, ob die standard-Bibliothek clang ist mit unterstütztstd::unique_ptr
.Wenn clang ist mit libc++ als seine standard-Bibliothek dann alle Versionen unterstützen
unique_ptr
und bieten auch<forward_list>
, so dass der test erfolgreich verläuft.Wenn clang ist mit libstdc++ dann, ob
unique_ptr
unterstützt wird, hängt von der libstdc++ - version.unique_ptr
Hinzugefügt wurde, libstdc++ GCC 4.3, das ist die gleiche version, die Hinzugefügt<forward_list>
, so dass, wenn dieser header vorhanden ist, dannunique_ptr
zu. Wenn Sie klappern mit den alten libstdc++, dass Schiffe, die mit der Apple-Werkzeugketten (von GCC-4.2), dannunique_ptr
wird nicht unterstützt, aber weder ist<forward_list>
, so schlägt der test fehl, und Sie verwendenauto_ptr
statt.Diese Arbeit sollte für alle GCC/libstdc++, Clang/libc++ oder Clang/libstdc++ - Kombination in der wildnis gefunden. Ich weiß nicht, was benötigt wird, um VC++/Dinkumware und Clang/Dinkumware, aus deiner Antwort sieht es aus wie, vielleicht möchten Sie einfach nur die erste Bedingung zu:
Ich bin noch immer
error: no type named 'unique_ptr' in namespace 'std'
beim kompilieren mit-std=c++11
und ohne-stdlib=libc++
unter apples Clang (3.4 SVN) und LLVM - Clang (3.6).Werden, weil es verwendet die alte libstdc++ ausgeliefert, die auf Mac OS X, die kommt von GCC-4.2, so dass, obwohl Clang unterstützt C++ und definiert
__cplusplus == 201103L
wenn Sie-std=c++11
die std::lib nicht alle C++11-Unterstützung. So müssen Sie möglicherweise überprüfen Sie die std::lib verwendet wird, aber Sie immer noch nicht wollen, etwas mit TR1.So, es scheint bei der Verwendung von
-stdlib=libc++
, LLVM setztunique_ptr
imstd::
und nichtstd::tr1
.Denn die alte libstdc++ auf Mac OS X hat keine C++11-Unterstützung. Wie bereits vier Kommentare über diese.
unique_ptr
war neu in C++11. War es nicht in C++03, und es war nicht in TR1. Wenn Sie eine version von libstdc++ ab 2007 dann wirst du nicht um C++11-features, auch wenn Sie mit-std=c++11
auf der Befehl-Linie, aufgrund der linearen Natur der Zeit. Beachten Sie den letzten Satz habe ich Hinzugefügt, um die Antwort über eine Stunde vor.InformationsquelleAutor Jonathan Wakely