2011-01-26 15 views
7

लिए काम नहीं करते मैं नवीनतम उपलब्ध जीसीसी रिपोजिटरी से निर्माण का उपयोग कर रहा हूँ। मैंने इसका उपयोग करने का फैसला किया क्योंकि कुछ अतिरिक्त सी ++ 0 एक्स विशेषताएं। हालांकि अब मैं कुछ काम करने का अनुमान लगाता हूं - मैं आर-वैल्यू के माध्यम से मानचित्र में नया तत्व जोड़ना चाहता हूं। सरलीकृत कोड है, जो समस्या को दर्शाता है:आर-मूल्य आवेषण unordered_map

#include <tr1/unordered_map> 

class X 
{ 
    public: 
     X (void) { /* ... */ }; 
     X (const X& x) = delete; 
     X (X&& x) { /* ... */ }; 
}; 

int main (void) 
{ 
    std::tr1::unordered_map<int, X> map; 

    // using std::tr1::unordered_map<int, X>::value_type didn't help too 
    std::pair<int, X> value (1, X()); 

    map.insert (std::move (value)); 
} 

ध्यान दें, कि जब int कोड संकलित करता है तथा काम ठीक तरह कुछ आदिम प्रकार के साथ X वर्ग की जगह।

मेरी उत्पादन कोड कक्षा में एक्स के लिए इसी भी प्रतिलिपि निर्माता नहीं है।

त्रुटि संदेश (सभी टेम्पलेट से संबंधित त्रुटियों की तरह) है लंबी और अपठनीय और मुझे यकीन है कि अगर यह अच्छा विचार इसे यहाँ डाल करने के लिए है नहीं कर रहा हूँ। अगर आपको त्रुटि संदेश चाहिए तो मुझे सूचित करें, इसलिए मैं इस प्रश्न को अपडेट कर दूंगा। संदेश के अंतिम भाग दिलचस्प है:

(...) 
/usr/include/c++/trunk/ext/new_allocator.h:106:9: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ 
In file included from /usr/include/c++/trunk/utility:71:0, 
       from /usr/include/c++/trunk/tr1/unordered_map:34, 
       from kod.cpp:1: 
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, _T2 = X, std::pair<_T1, _T2> = std::pair<const int, X>]’ is implicitly deleted because the default definition would be ill-formed: 
/usr/include/c++/trunk/bits/stl_pair.h:110:17: error: use of deleted function ‘X::X(const X&)’ 

इसके अलावा इस, काम करना चाहिए क्योंकि इसी तरह के बग पहले से ही [C++0x] Implement emplace* in associative and unordered containers तय हुई थी।

शायद मैं कुछ गलत कर रहा हूं? मैं यह सुनिश्चित करना चाहता हूं कि यह रिपोर्ट करने से पहले जीसीसी या libstdC++ बग है।

+0

लापता आर-मूल्य संगत 'सम्मिलित करें' विधि अब अप्रकाशित जीसीसी 4.6.0 में उपलब्ध है। – Goofy

उत्तर

5

आपका कोड tr1 के आपके उपयोग के अलावा मेरे लिए सही लग रहा है। tr1- योग्य सामान rvalue संदर्भ के बारे में पता नहीं है या semantics ले जाएँ।

मैंने अपना कोड लिया, हेडर और नामस्थान क्वालीफायर से tr1 हटा दिया, और जी ++ - 4.4 और libC++ (http://libcxx.llvm.org/) का उपयोग करके सफलतापूर्वक संकलित किया। Tr1 को हटाने का प्रयास करें।

+0

वर्क्स ,, अजीब कुछ समय पहले संकलक मुझे इस्तेमाल करने "tr1" नाम स्थान जब मैं TR1 सुविधाओं में से कुछ का उपयोग करने के लिए मजबूर कोशिश कर रहा था ... – Goofy

+2

tr1 एक गैर मानक तकनीकी रिपोर्ट को दर्शाता है। इसका मतलब है कि इसमें किसी भी विशेषताओं को वैकल्पिक माना जाता है - मानक को उनकी आवश्यकता नहीं होती है। tr1 में लाइब्रेरी घटकों में से कई शामिल हैं जिन्हें बाद में सी ++ 0x में स्थानांतरित कर दिया गया है। कभी-कभी उस कदम के दौरान std :: tr1 से std :: तक, घटक संशोधित किए गए थे। Unordered_map में move semantics जोड़ना इस तरह के एक संशोधन का एक उदाहरण है। tr1 सी ++ 0x भविष्यवाणी करता है। हो सकता है कि आप एक संस्करण का उपयोग कर रहे हों जिसमें tr1 था, लेकिन सी ++ 0x विशेषताएं नहीं थीं। –

+0

(बेल्ट) एसओ पर आपका स्वागत है :) –

0

std::pair<int, X>std::pair<int, X> नहीं है। यह std::pair<const int, X> है। हो सकता है कि आप value के लिए उस प्रकार का उपयोग करें, यह बेहतर काम करेगा।

decltype(map)::value_type value(1, X()); 
map.insert(std::move(value)); 

हालांकि मुझे बिल्कुल नहीं पता कि आपका कोड क्यों काम नहीं करना चाहिए।

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