2012-01-17 7 views
8

मैं कोड के इस टुकड़े में std :: unique_ptr का उपयोग कर रहा हूं जो संकलित करता है और जैसा कि मैंने अपेक्षा की है।ग्रहण सीडीटी अनुक्रमण और std :: unique_ptr

std::stringstream out; 
out << std::setw(3) << std::setfill('0') << i; 
std::unique_ptr<std::string> s(new std::string(out.str())); 
s->insert(s->end()-2, 1, '.'); 
return std::move(s); 

हालांकि, मुझे एक्लिप्स सीडीटी से त्रुटि संदेश मिल रहे हैं। चौथी पंक्ति पर: विधि 'सम्मिलित' को हल नहीं किया जा सका, विधि 'अंत' को हल नहीं किया जा सका।

पहले, मुझे std :: unique_ptr नाम के प्रदर्शन पर त्रुटियां भी मिल रही थीं। this प्रश्न के उत्तर में वर्णित अनुसार प्री-प्रोसेसर प्रतीक __GXX_EXPERIMENTAL_CXX0X__ और इंडेक्स का पुनर्निर्माण करके इसे हल किया गया था।

क्या सीडीटी को समझने का कोई तरीका है कि एस प्रकार :: स्ट्रिंग * है और यह एस-> डालने() और एस-> एंड() के लिए std :: स्ट्रिंग में दिखना चाहिए?

पुनश्च: मैं ग्रहण 3.7.1 और CDT उपयोग कर रहा हूँ 8.0.0.201106081058

पीएस 2: मैं, ऊपर सवाल में एक टिप्पणी के रूप में इस पोस्ट करने के लिए पसंद आया होता, लेकिन मैं नहीं कर सकता शायद क्योंकि मैं एक हूँ नया उपयोगकर्ता

उत्तर

4

ऐसा लगता है जैसे ग्रहण सीडीटी सूचकांक अद्वितीय_ptr :: सूचक प्रकार को कम करने में सक्षम नहीं है जिसे रिटर्न प्रकार ऑपरेटर ->() के रूप में भी उपयोग किया जाता है। जब आप की तरह

std::unique_ptr<Type *> ptr; 
ptr.reset(new Type); 

एक त्रुटि "पता चला" हो जाएगा कि वहाँ कोई मिलता-जुलता अधिभार होगा, और केवल उम्मीदवार reset(?) होगा कि कुछ लिखते हैं तो आपको यह देख सकते हैं। तो यह स्पष्ट रूप से एक बग है।

2

यह समस्या हाल ही में सीडीटी 8.1.1 में तय की गई है। बस मदद करें-> अपडेट के लिए जांचें और इसे डाउनलोड और इंस्टॉल किया जाएगा। मैंने unique_ptr का परीक्षण किया है और यह ठीक से अनुक्रमित है।

+1

मैं पुष्टि कर सकता है कि यह CDT 8.1.2 में काम कर रहा है – Nobody

1

मेरे पास एक्लिप्स सीडीटी (9.3) के नए संस्करण पर एक ही समस्या है। मैंने इंटरनेट पर मिलने वाली सभी चालों को आजमाने की कोशिश की, बदलाव के लिए उम्मीद करते हुए हर बार मेरी अनुक्रमणिका का पुनर्निर्माण किया। लेकिन सूचकांक std::unique_ptr<T>::operator->() के प्रकार को कम करने में सक्षम नहीं था। ग्रहण में (निर्माण न केवल अनुक्रमण विकल्प के लिए निश्चित रूप से,)

# ifdef ECLIPSE_INDEXER_WORKAROUND 
MyType* my_var; 
# else 
std::unique_ptr<MyType> my_var; 
# endif  

मैं पूर्वप्रक्रमक प्रतीकों को ECLIPSE_INDEXER_WORKAROUND जोड़ने के लिए, और अनुक्रमण फिर से उपयोगी है: अंत में, मैं एक बहुत ही सरल तरीके का उपयोग करने का फैसला किया!

आदेश में कोड अपवित्र करने के लिए कम, हम एक मैक्रो का उपयोग कर सकते हैं:

# ifdef ECLIPSE_INDEXER_WORKAROUND 
# define MY_UNIQUE_PTR(type) type* 
# else 
# define MY_UNIQUE_PTR(type) std::unique_ptr<type> 
# endif 

MY_UNIQUE_PTR(int) pint{ new int(42) };