error :: make_unique bukan anggota 'std'

92

Saya mencoba untuk mengkompilasi program kumpulan benang berikut yang diposting pada tinjauan kode untuk mengujinya.

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

Tapi saya mendapatkan kesalahan

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 ‘unsignedauto ptr1 = std::make_unique<unsigned>();
                              ^
main.cpp:14:17: error: ‘make_unique’ is not a member of ‘stdauto ptr2 = std::make_unique<unsigned>();
             ^
main.cpp:14:34: error: expected primary-expression before ‘unsignedauto ptr2 = std::make_unique<unsigned>();
Ali786
sumber
1
Kompiler apa yang Anda gunakan?
Matteo Italia
3
Compiler / flags apa yang Anda gunakan? make_uniqueadalah fitur c ++ 14
MatthiasB
kemungkinan besar Anda tidak memiliki kode untuk itu karena ini bukan bagian dari c ++ 11?
Alexander Oh
Dia entah bagaimana menggunakan fitur c ++ 14, dan Anda tidak.
BЈовић
akan ada implementasi make_unique. tidak sesulit itu;) msdn.microsoft.com/en-us/library/dn439780.aspx
Alexander Oh

Jawaban:

143

make_uniqueadalah fitur C ++ 14 yang akan datang dan karenanya mungkin tidak tersedia pada kompiler Anda, meskipun kompatibel dengan C ++ 11.

Namun Anda dapat dengan mudah menggulung penerapan Anda sendiri:

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

(FYI, ini adalah versi terakhir darimake_unique yang terpilih ke dalam C ++ 14. Ini termasuk fungsi tambahan untuk mencakup array, tetapi gagasan umumnya masih sama.)

ComicSansMS
sumber
6
@ ali786 Tergantung pada kompilator Anda. Dengan GCC, misalnya, Anda meneruskan -std=c++1ydi baris perintah.
Angew tidak lagi bangga dengan SO
1
@ ali786 Mungkin GCC 4.8.1 tidak mendukung bagian C ++ 14 ini? Sudahkah Anda berkonsultasi dengan dokumennya? BTW, GCC terbaru adalah 4.9.0 .
Angew tidak lagi bangga dengan SO
3
@ ali786 Sebenarnya, ini bukanlah fitur dari kompilator itu sendiri, melainkan implementasi pustaka standar (yang kemungkinan besar adalah libstdc ++ dalam kasus Anda). Afaik, dukungan untuk fitur khusus ini hanya ditambahkan dengan gcc 4.9.0 (seperti yang juga disarankan oleh posting ini ).
ComicSansMS
1
@VictorEijkhout Ya, secara harfiah . Anda mungkin ingin mengumpulkan contoh minimal dan memposting pertanyaan baru jika Anda kesulitan menjalankannya. (Dan fyi, Anda dapat mengapit teks di backticks `untuk membuatnya ditampilkan sebagai kode dalam komentar)
ComicSansMS
1
Saya memiliki gcc 5.4 dan saya masih mendapatkan kesalahan ini bahkan ketika saya mencoba semua flag yang disebutkan di sini.
Timothy Swan
16

Jika Anda memiliki kompiler terbaru, Anda dapat mengubah yang berikut ini di pengaturan build Anda:

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

Ini berhasil untuk saya.

Anil8753
sumber
1
Ini khusus untuk GCC / Clang dan mungkin tidak berfungsi untuk kompiler lain.
Tambre
7

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

Jagger Yu
sumber
1

Ini terjadi pada saya saat bekerja dengan XCode (Saya menggunakan versi XCode terbaru pada 2019 ...). Saya menggunakan, CMake untuk integrasi build. Menggunakan direktif berikut di CMakeLists.txt memperbaikinya untuk saya:

set(CMAKE_CXX_STANDARD 14).

Contoh:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...
kovac
sumber
1

Jika Anda terjebak dengan c ++ 11 , Anda bisa mendapatkan make_uniquedari abseil-cpp , kumpulan pustaka C ++ open source yang diambil dari basis kode internal Google.

Alex Cohn
sumber
0

Dalam kasus saya, saya perlu memperbarui std = c ++

Maksud saya dalam file gradle saya adalah ini

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"
            }
        }
       ....
    }

Saya mengubah baris ini

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"
            }
        }
       ....
    }

Itu dia...

Aleksey Timoshchenko
sumber