त्रुटि :: 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
आप किस कंपाइलर का उपयोग कर रहे हैं?
मैट्टो इटालिया

3
आप क्या संकलक / झंडे का उपयोग करते हैं? make_uniqueएक c ++ 14 फीचर है
MatthiasB

सबसे अधिक संभावना है कि आपके पास इसके लिए कोड नहीं है क्योंकि यह c ++ 11 का हिस्सा नहीं है?
एलेक्स

वह किसी तरह c ++ 14 सुविधाओं का उपयोग कर रहा है, और आप नहीं हैं।
B15овиЈ

मेक_निक का कार्यान्वयन होगा। यह मुश्किल नहीं है;) msdn.microsoft.com/en-us/library/dn439780.aspx
एलेक्स

जवाबों:


143

make_uniqueएक है आगामी सी ++ 14 सुविधा और इस तरह अपने संकलक पर उपलब्ध नहीं हो सकता है, भले ही वह सी ++ 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
@ अली 786 आपके कंपाइलर पर निर्भर करता है। जीसीसी के साथ, उदाहरण के लिए, आप -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 के साथ जोड़ा गया था .0.0 (जैसा कि इस पोस्ट द्वारा भी सुझाव दिया गया है )।
कॉमिक्ससंस

1
@VictorEijkhout हां, सचमुच । आप एक न्यूनतम उदाहरण एक साथ रखना चाहते हैं और एक नया प्रश्न पोस्ट कर सकते हैं यदि आपको इसे चलाने में कोई परेशानी हो रही है। (और फ़िजी, आप पाठ को बैकटिक्स में संलग्न कर सकते हैं `इसे टिप्पणियों में कोड के रूप में प्रदर्शित करने के लिए)
कॉमिक्ससंस

1
मेरे पास 5.4 है और मैं अभी भी यह त्रुटि प्राप्त कर रहा हूं जब मैं यहां उल्लिखित सभी झंडे आजमाता हूं।
टिमोथी स्वान

16

यदि आपके पास नवीनतम संकलक हैं, तो आप अपनी बिल्ड सेटिंग्स में निम्नलिखित को बदल सकते हैं:

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

यह मेरे लिए काम करता है।


1
यह जीसीसी / क्लैंग के लिए विशिष्ट है और अन्य संकलक के लिए काम नहीं कर सकता है।
तमब्रे २४'१ '


1

XCode के साथ काम करते समय मेरे साथ ऐसा होता है (मैं 2019 में XCode के सबसे वर्तमान संस्करण का उपयोग कर रहा हूं ...)। मैं निर्माण एकीकरण के लिए 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 के साथ फंस गए हैं , तो आप abseil-cppmake_unique से प्राप्त कर सकते हैं , Google के आंतरिक कोडबेस से तैयार C ++ पुस्तकालयों का एक खुला स्रोत संग्रह।


0

मेरे मामले में मुझे std = c ++ अपडेट करना था

मेरा मतलब है कि मेरे ग्रेडल फ़ाइल में यह था

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

बस...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.