2015-11-23 18 views
8

में फ़ंक्शन के लिए पैरामीटर के रूप में, इसलिए मैं एक अलग थ्रेड में लॉन्च किए गए फ़ंक्शन के पैरामीटर के रूप में एक std :: अद्वितीय पॉइंटर को पास करने का प्रयास कर रहा हूं, और मुझे एक अजीब त्रुटि मिल रही है संकलन समय पर पढ़ी जाए:std :: unique_ptr std :: thread

1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional(1149): error C2280: 'std::unique_ptr<Widget,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function 

इस कोड को, जो अभी भी एक ही मुद्दा reproduces का एक सरलीकृत संस्करण है:

#include <thread> 
#include <memory> 
#include <iostream> 

class Widget 
{ 
public: 
    Widget() : m_data(0) 
    { 
    } 

    void prepareData(int i) 
    { 
    m_data = i; 
    } 

    int getData() const 
    { 
    return m_data; 
    } 

private: 
    int m_data; 
}; 

void processWidget(std::unique_ptr<Widget> widget) 
{ 
    std::cout << widget->getData() << std::endl; 
} 

int main() 
{ 
    std::unique_ptr<Widget> widget(new Widget()); 
    widget->prepareData(42); 

    std::thread t(processWidget, std::move(widget)); 
    t.join(); 

    return 0; 
} 

मेरा अनुमान है कुछ विजेट वस्तु के विनाश के साथ कुछ गड़बड़ है है मुख्य() से, हालांकि मैं इस मुद्दे को इंगित नहीं कर सकता। क्या उस चर को साफ करने के लिए कुछ अतिरिक्त करना आवश्यक है? वैसे, मैं वीएस2013 का उपयोग कर रहा हूँ।

+1

@DevSolar नहीं 'std :: thread' हमेशा एक XValue अपने हैंडलर के पास होता है, और यह एक MSVC खराबी है? –

+2

जीसीसी इसे स्वीकार करता है। 'std :: थ्रेड टी ([और विजेट]() {processWidget (std :: move (विजेट));}); 'यह भी काम करता है। –

+1

Orwel DevC++ 5.11 ब्रो में अच्छी तरह से काम करता है !! आपके कोड –

उत्तर

-1

आपको unique_ptr की प्रतिलिपि बनाने की अनुमति नहीं है, इसलिए कॉपी कन्स्ट्रक्टर अक्षम है। यह संकलक त्रुटि इंगित कर रहा है।

आप एक संदर्भ के साथ इसे ठीक कर सकते हैं:

void processWidget(std::unique_ptr<Widget>& widget) 
+3

कोई भी ओपी के कोड –

+0

@PiotrSkotnicki में प्रतिलिपि नहीं बना रहा है, लेकिन सीधे ['std :: thread'] के लिए कन्स्ट्रक्टर (http://en.cppreference.com/w/cpp/thread/thread/thread) प्रतियां/अपने तर्कों को थ्रेड अक्षय भंडारण में ले जाता है और उसके बाद फ़ंक्शन को कॉल करते समय कॉपी किया जाता है। – sjdowling

+0

@sjdowling क्या आप कृपया एक मानक संदर्भ प्रदान कर सकते हैं जो कहता है कि 'std :: thread' एक प्रतिलिपि को अपने हैंडलर को कॉल करने के लिए बनाता है? –

संबंधित मुद्दे