Kann nicht kompilieren von C++11 Quelle mit GCC 5.1 toolchain
Ich versuche zu kompilieren eine Bibliothek geschrieben, mit C++11 Funktionen mit GCC 5.1 auf Ubuntu. Allerdings beschwert es sich std::unique_ptr
ist nicht definiert.
gcc (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0
g++ (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0
CXX-flags:
-std=c++11 -Wall -Wextra -Weffc++ -pedantic
Ausgabe:
error: ‘unique_ptr’ in namespace ‘std’ does not name a template type
std::unique_ptr< detail::RegexImpl > m_pimpl;
Allerdings bin ich in der Lage zu kompilieren Sie die exakt gleiche code auf OSX.
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
CXX-flags:
-stdlib=libc++ -std=c++11 -Wall -Wextra -Weffc++ -pedantic
Was mache ich falsch?
- Bitte zeigen Sie die Quelle. Sind Sie einschließlich
<memory>
? - Ich hatte kein problem mit gcc 5.1 auf Ubuntu. Ich habe es kompiliert aus dem source Hinzugefügt, die includes und lib-path env-Variablen und es funktioniert.
- Es klingt wie Sie sind, sich auf die von der Implementierung abhängig inter-header-Abhängigkeiten. Kein Wunder, wenn nicht-portablen code bricht, wenn Sie versuchen, port, zum Glück ist der fix ist einfach.
- BTW, ich bin traurig, dass der GCC sagt die irreführende "template-Typ".
- Ja, es wäre schöner zu sehen, so etwas wie "Fehler: 'unique_ptr' in namespace 'std' existiert nicht" hier. Das würde erfordern einige zusätzliche Arbeit auf dem Teil der GCC-Entwickler, wenn die Fehlermeldung ist geteilt zwischen der "nicht existiert" und "existiert, ist aber nicht eine Vorlage" Fälle, obwohl.
- Gut, nur ändern Sie ihn auf "Vorlage" wäre ein Anfang 🙂
- Wusste gar nicht das war, was Sie bedeutete. 🙂 Ja, die standard-Anwendungen "class template" und "function template". Weder "template-Typ" oder "Art Vorlage" ist ein standard-Begriff, aber "Art Vorlage" ist besser im Einklang mit den standard-Bedingungen. (Oder, nach der Bearbeitung, nur "Vorlage" funktioniert auch.)
- Ich habe überprüft die Quelle, und in der Tat die <Speicher - > enthalten war, fehlt. Ich nahm an, es war dort, weil der code kompiliert wunderbar mit Clang. Ich bin nicht der Autor der Bibliothek, so kann ich nicht kommentieren, inter-header-Abhängigkeiten, aber ist das die Ursache?
- Ja. Eine Bibliothek header
A
umfassen kann-Bibliothek header -B
für so ziemlich jeden Grund. Wenn Sie brauchen, Bibliothek headerB
, aber nur include-Bibliothek header -A
ist, dann kann es arbeiten einige Implementierungen, und nicht auf andere. Und auch die libc++ hat so still im Lieferumfang enthalten Header. - Ja, viele Menschen sind verwirrt, was Vorlagen sind wirklich ein Teil IMO, weil Compiler und Bücher und schlechte tutorials sagen dumme Dinge wie "template-Klasse" als ob das irgendeine Magische Art von Klasse. Sie und ich wissen, dass das nicht der Fall. Wenn Sie wusste, dass es stattdessen ist eine Vorlage, die macht einer Klasse, vielleicht, Sie würden eine einfachere Zeit davon. 🙂 Eh.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist nicht alles falsch. Die Bibliothek ist die Quelle fehlt, eine
#include <memory>
.Dies ist einfach eine unglückliche Fehler, die von der Autorin in der Bibliothek. Es ist überraschend alltäglich für Menschen angewiesen auf bestimmte standard-Header einfach so passiert auf andere standard-Header auf Ihre Besondere Umsetzung, ohne zu prüfen, dass Sie mit allen
#include
Aussagen, wie Sie sollten.Könnten Sie hacken die
#include
für jetzt aber, auf lange Sicht, Sie sollten heben Sie einen Fehler mit der library Autor und vielleicht sogar dazu beitragen, einen patch, wenn das Projekt akzeptiert patches.#include
wenn es nicht bereits vorhanden ist. Kann nicht wirklich schief gehen, wenn Sie mithalten, obwohl es nicht ein wenig langweilig nach einer Weile.