ข้อผิดพลาด :: make_unique ไม่ใช่สมาชิกของ 'std'


92

ฉันกำลังพยายามรวบรวมโปรแกรมเธรดพูลต่อไปนี้ที่โพสต์ในการตรวจสอบโค้ดเพื่อทดสอบ

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

แต่ฉันได้รับข้อผิดพลาด

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 ‘stdauto 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
คุณใช้คอมไพเลอร์อะไร
Matteo Italia

3
คุณใช้คอมไพเลอร์ / แฟล็กอะไร make_uniqueเป็นฟีเจอร์ c ++ 14
MatthiasB

เป็นไปได้มากว่าคุณไม่มีรหัสเนื่องจากไม่ใช่ส่วนหนึ่งของ c ++ 11?
Alexander Oh

เขาใช้คุณสมบัติ c ++ 14 อย่างใด แต่คุณไม่ได้เป็น
BЈовић

จะมีการนำ make_unique มาใช้ มันไม่ยากหรอก
Alexander Oh

คำตอบ:


143

make_uniqueเป็นฟีเจอร์ C ++ 14 ที่กำลังจะมาถึงดังนั้นจึงอาจไม่มีในคอมไพเลอร์ของคุณแม้ว่าจะเป็นไปตาม C ++ 11 ก็ตาม

อย่างไรก็ตามคุณสามารถม้วนการใช้งานของคุณเองได้อย่างง่ายดาย:

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 นี่คือเวอร์ชันสุดท้ายmake_uniqueที่ได้รับการโหวตให้เป็น C ++ 14 ซึ่งรวมถึงฟังก์ชันเพิ่มเติมที่จะครอบคลุมอาร์เรย์ แต่แนวคิดทั่วไปยังคงเหมือนเดิม)


6
@ ali786 ขึ้นอยู่กับคอมไพเลอร์ของคุณ ตัวอย่างเช่นด้วย GCC คุณส่งผ่าน-std=c++1yบรรทัดคำสั่ง
Angew ไม่ภูมิใจใน SO

1
@ ali786 บางที GCC 4.8.1 ไม่รองรับส่วนนี้ของ C ++ 14? คุณได้ศึกษาเอกสารหรือไม่? BTW ที่ GCC ล่าสุด4.9.0
Angew ไม่ภูมิใจใน SO

3
@ ali786 อันที่จริงนี่ไม่ใช่คุณสมบัติของตัวคอมไพเลอร์ แต่เป็นการใช้งานไลบรารีมาตรฐาน (ซึ่งน่าจะเป็นlibstdc ++ในกรณีของคุณ) Afaik การรองรับคุณสมบัติเฉพาะนี้ถูกเพิ่มด้วย gcc 4.9.0 เท่านั้น (ตามที่แนะนำในโพสต์นี้ )
ComicSansMS

1
@VictorEijkhout ใช่แท้จริง คุณอาจต้องการรวบรวมตัวอย่างเล็กน้อยและโพสต์คำถามใหม่หากคุณมีปัญหาในการเรียกใช้ (และ fyi คุณสามารถใส่ข้อความใน backticks เพื่อให้แสดงเป็นโค้ดในความคิดเห็น)
ComicSansMS

1
ฉันมี gcc 5.4 และฉันยังคงได้รับข้อผิดพลาดนี้แม้ว่าฉันจะลองแฟล็กทั้งหมดที่กล่าวถึงที่นี่
Timothy Swan

16

หากคุณมีคอมไพเลอร์ล่าสุดคุณสามารถเปลี่ยนสิ่งต่อไปนี้ในการตั้งค่าบิลด์ของคุณ:

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

สิ่งนี้ใช้ได้กับฉัน


1
สิ่งนี้เฉพาะสำหรับ GCC / Clang และอาจใช้ไม่ได้กับคอมไพเลอร์อื่น
tambre


1

สิ่งนี้เกิดขึ้นกับฉันขณะทำงานกับ XCode (ฉันใช้ XCode เวอร์ชันล่าสุดในปี 2019 ... ) ฉันใช้ CMake สำหรับการรวมบิวด์ การใช้คำสั่งต่อไปนี้ใน CMakeLists.txt แก้ไขให้ฉัน:

set(CMAKE_CXX_STANDARD 14).

ตัวอย่าง:

cmake_minimum_required(VERSION 3.14.0)
set(CMAKE_CXX_STANDARD 14)

# Rest of your declarations...

1

หากคุณติดc ++ 11คุณสามารถหาได้make_uniqueจากabseil-cppซึ่งเป็นคอลเลกชันโอเพ่นซอร์สของไลบรารี C ++ ที่ดึงมาจากโค้ดเบสภายในของ Google


0

ในกรณีของฉันฉันจำเป็นต้องอัปเดต std = c ++

ฉันหมายความว่าในไฟล์ gradle ของฉันคือสิ่งนี้

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

ผมเปลี่ยนสายนี้

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

แค่นั้นแหละ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.