2011-09-08 16 views
6

के लिए काम नहीं करता है क्या कोई ऐसी जगह है जहां मैं इसकी पुष्टि कर सकता हूं? मुझे यकीन नहीं है कि यह जीसीसी या मेरे कोड की समस्या है या नहीं। उदाहरण के लिए, निम्न कोड संकलित नहीं करता है:जीसीसी 4.4/4.5 unique_ptr unordered_set/unordered_map

#include <unordered_set> 
#include <memory> 
using namespace std; 

int main() { 
    unordered_set<unique_ptr<int> > s; 
    unique_ptr<int> p(new int(0)); 
    s.insert(move(p)); 
    return 0; 
} 

त्रुटि संदेश बहुत बड़ा है और मैं यहां नहीं रखना चाहता हूं। जीसीसी संस्करण 4.5.3 है, झंडा संकलित है -std = gnu ++ 0x। 4.4.5 पर भी परीक्षण किया।

+0

ऐसा शायद इसलिए है क्योंकि 'std :: hash'' std :: unique_ptr' के लिए विशिष्ट नहीं है। – Mankarse

+1

@Mankarse इसके लिए एक विशेषज्ञता है, लेकिन भ्रमित रूप से यह 20.7.2.6 स्मार्ट पॉइंटर हैश समर्थन [util.smartptr.hash] (n3290) में दिखाई देता है, 'std :: shared_ptr' के चश्मा के ठीक बाद, कुछ हद तक' std से दूर :: unique_ptr'। –

+0

एनबी आपको 'std :: move'' move' नहीं कहना चाहिए, आप नहीं चाहते कि एडीएल एक अलग फ़ंक्शन ढूंढें। –

उत्तर

4

आपका कोड सही है। यह जीसीसी 4.5 में एक ज्ञात मुद्दा है। इसे 4.6 में तय किया गया है। http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436 देखें। यह आदेशित कंटेनरों को भी प्रभावित करता है (std :: map, std :: set आदि)। शायद सबसे आसान कामकाज (थोड़ा प्रदर्शन दंड पर) std :: unique_ptr के बजाय std :: shared_ptr का उपयोग करना होगा।

8

जीसीसी 4.6.1 आपके कोड को स्वीकार करता है और मुझे इसके साथ कुछ भी गलत नहीं लगता है (यानी एक सहयोगी कंटेनर का मान_टाइप इम्प्लेबल होने योग्य होना चाहिए और std::unique_ptr इसे रोक नहीं देता है)। संभवतः यह जीसीसी 4.5 में कमी है।

3

मैं पुष्टि कर सकता हूं कि यह जीसीसी 4.4.5 के साथ एक मुद्दा है।

error: deleted function [unique_ptr's copy ctor]... used here [g++-v4/bits/stl_tree.h:136].

प्रश्न में एसटीएल समारोह का हिस्सा है: जो वास्तव एसटीएल में कुछ समारोह unique_ptr नकल करने का प्रयास किया है कि की ओर संकेत एक लंबे संकलक त्रुटि संदेश में एक std :: सेट परिणामों में एक unique_ptr सम्मिलित करने का प्रयास std :: set सहित कई एसटीएल कक्षाओं की आंतरिक वृक्ष संरचना। यह "__GXX_EXPERIMENTAL_CXX0X__" ifdef के भीतर भी है, जिसका अनुमान है कि जीसीसी 4.4 आधिकारिक रूप से समर्थन नहीं करता है जिसे हम करने की कोशिश कर रहे हैं।

यदि आप जीसीसी 4.6 में अपग्रेड नहीं करना चाहते हैं तो आप हमेशा एक std :: वेक्टर लपेट सकते हैं और रणनीतिक रूप से जांच सकते हैं और अपने कोड में कुछ बिंदुओं पर डुप्लिकेट को हटा सकते हैं।