error :: make_unique ist kein Mitglied von 'std'

89

Ich versuche, das folgende Thread-Pool-Programm zu kompilieren, das bei der Codeüberprüfung veröffentlicht wurde, um es zu testen.

/codereview/55100/platform-independant-thread-pool-v4

Aber ich bekomme die Fehler

threadpool.hpp: In member function std::future<decltype (task((forward<Args>)(args)...))> threadpool::enqueue_task(Func&&, Args&& ...)’:
threadpool.hpp:94:28: error: make_unique was not declared in this scope
     auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>  (std::move(bound_task), std::move(promise));
                        ^
threadpool.hpp:94:81: error: expected primary-expression before ‘>’ token
     auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise));
                                                                             ^
main.cpp: In function int main()’:
main.cpp:9:17: error: make_unique is not a member of std
 auto ptr1 = std::make_unique<unsigned>();
             ^
main.cpp:9:34: error: expected primary-expression before unsigned
 auto ptr1 = std::make_unique<unsigned>();
                              ^
main.cpp:14:17: error: make_unique is not a member of std
 auto ptr2 = std::make_unique<unsigned>();
             ^
main.cpp:14:34: error: expected primary-expression before unsigned
 auto ptr2 = std::make_unique<unsigned>();
Ali786
quelle
1
Welchen Compiler verwenden Sie?
Matteo Italia
3
Welchen Compiler / welche Flags verwenden Sie? make_uniqueist eine c ++ 14 Funktion
MatthiasB
höchstwahrscheinlich haben Sie nicht den Code dafür, da er nicht Teil von c ++ 11 ist?
Alex
Er verwendet irgendwie C ++ 14-Funktionen, und Sie sind es nicht.
BЈовић
es würde eine Implementierung von make_unique geben. es ist nicht so schwierig;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alex

Antworten:

140

make_uniqueist eine kommende C ++ 14-Funktion und daher möglicherweise nicht auf Ihrem Compiler verfügbar, selbst wenn sie C ++ 11-kompatibel ist.

Sie können jedoch ganz einfach Ihre eigene Implementierung rollen:

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

(Zu Ihrer Information, hier ist die endgültige Versionmake_unique , die in C ++ 14 gewählt wurde. Dies beinhaltet zusätzliche Funktionen zur Abdeckung von Arrays, aber die allgemeine Idee ist immer noch dieselbe.)

ComicSansMS
quelle
6
@ ali786 Hängt von Ihrem Compiler ab. Mit GCC übergeben Sie beispielsweise -std=c++1ydie Befehlszeile.
Angew ist nicht mehr stolz auf SO
1
@ ali786 Vielleicht unterstützt GCC 4.8.1 diesen Teil von C ++ 14 nicht? Haben Sie die Dokumente konsultiert? Übrigens ist der neueste GCC 4.9.0 .
Angew ist nicht mehr stolz auf SO
3
@ ali786 Eigentlich ist dies keine Funktion des Compilers selbst, sondern der Standardbibliotheksimplementierung ( in Ihrem Fall höchstwahrscheinlich libstdc ++ ). Afaik, die Unterstützung für diese spezielle Funktion wurde nur mit gcc 4.9.0 hinzugefügt (wie auch in diesem Beitrag vorgeschlagen ).
ComicSansMS
1
@ VictorEijkhout Ja, buchstäblich . Möglicherweise möchten Sie ein minimales Beispiel zusammenstellen und eine neue Frage stellen, wenn Sie Probleme haben, sie zum Laufen zu bringen. (Und zu Ihrer Information, Sie können Text in Backticks einschließen, damit er als Code in Kommentaren
angezeigt wird.
1
Ich habe gcc 5.4 und erhalte immer noch diesen Fehler, selbst wenn ich alle hier genannten Flags ausprobiere.
Timothy Swan
16

Wenn Sie über den neuesten Compiler verfügen, können Sie Folgendes in Ihren Build-Einstellungen ändern:

 C++ Language Dialect    C++14[-std=c++14]

Das funktioniert bei mir.

Anil8753
quelle
1
Dies ist spezifisch für GCC / Clang und funktioniert möglicherweise nicht für andere Compiler.
Tambre
6

1.gcc version> = 5
2.CXXFLAGS + = -std = c ++ 14
3. #include <memory>

Jagger Yu
quelle
1

Dies passiert mir während der Arbeit mit XCode (ich verwende die aktuellste Version von XCode im Jahr 2019 ...). Ich verwende CMake für die Build-Integration. Die folgende Anweisung in CMakeLists.txt hat es für mich behoben:

set(CMAKE_CXX_STANDARD 14).

Beispiel:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...
kovac
quelle
1

Wenn Sie mit stecken c ++ 11 , können Sie sich make_uniquevon abseil-CPP , eine Open - Source - Sammlung von C ++ Bibliotheken aus dem Google-interner Code - Basis erstellt.

Alex Cohn
quelle
0

In meinem Fall musste ich std = c ++ aktualisieren

Ich meine in meiner Gradle-Datei war das

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11", "-Wall"
                arguments "-DANDROID_STL=c++_static",
                        "-DARCORE_LIBPATH=${arcore_libpath}/jni",
                        "-DARCORE_INCLUDE=${project.rootDir}/app/src/main/libs"
            }
        }
       ....
    }

Ich habe diese Zeile geändert

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++17", "-Wall"   <-- this number from 11 to 17 (or 14)
                arguments "-DANDROID_STL=c++_static",
                        "-DARCORE_LIBPATH=${arcore_libpath}/jni",
                        "-DARCORE_INCLUDE=${project.rootDir}/app/src/main/libs"
            }
        }
       ....
    }

Das ist es...

Aleksey Timoshchenko
quelle