2014-10-13 5 views
8

मेरे पास एक ऑब्जेक्ट है जिसे मैं केवल std::map के अंदर आवंटित करना चाहता हूं।std :: map में एक गैर-प्रतिलिपि योग्य और गैर-चलने योग्य ऑब्जेक्ट आवंटित कैसे करें?

#include <map> 

class Value 
{ 
public: 
    Value(int value) { _value = value;} 
    Value(const Value&) = delete; 
    Value& operator=(const Value&) = delete; 
    Value(Value&&) = default;  // *** 
    void* operator new(size_t) = delete; // not on free store 
private: 
    int _value; 
}; 

class Container 
{  
public: 
    Container(); 
    Value* addToMap(int key) { 
     auto ret = _map.emplace(key, key); 
     return &(ret.first->second); 
    } 
private: 
    std::map<int, Value> _map; 
}; 

आदेश में यह बजना का उपयोग कर मैं एक पंक्ति डिफ़ॉल्ट चाल निर्माता का अनुरोध तारों से चिह्नित जोड़ने के लिए किया था मैक पर संकलन करने के लिए: यहाँ सरलीकृत कोड है। हालांकि विंडोज विजुअल स्टूडियो में संकलित होने पर यह लाइन C2610 त्रुटि का कारण बनती है। ऐसा लगता है कि वीएस2013 सी ++ 11 गैर अनुपालन में डिफ़ॉल्ट चाल कन्स्ट्रक्टर उत्पन्न करने में असमर्थता शामिल है। क्या मानक मानचित्र के अंदर किसी ऑब्जेक्ट को आवंटित करने का कोई अलग तरीका है जो प्लेटफॉर्म पर संकलित होगा या क्या मुझे अपना खुद का चाल कन्स्ट्रक्टर लागू करना होगा?

+0

आप इस प्रतिबंध जोड़ने के लिए क्यों चाहते हो? –

+0

मैं ऑब्जेक्ट को विशेष रूप से कंटेनर द्वारा स्वामित्व में रखना चाहता हूं और अन्य कोड को नए कॉल करने और हटाने से रोक सकता हूं। – LRaiz

+0

आप वस्तुओं और डेटा संरचनाओं को मिला रहे हैं। यदि आपकी डेटा संरचना का उपयोगकर्ता ऑब्जेक्ट की प्रतिलिपि बनाना चाहता है, तो क्यों नहीं? –

उत्तर

8

एक विकल्प std::piecewise_construct उपयोग करने के लिए है:

Value* addToMap(int key) { 
    auto ret = _map.emplace(std::piecewise_construct 
          , std::forward_as_tuple(key) 
          , std::forward_as_tuple(key)); 
    return &(ret.first->second); 
} 

VC++ DEMO

+0

अच्छा लगता है। धन्यवाद। – LRaiz

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