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>();

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.)


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.


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>


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

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.