2015-10-07 19 views
12

के साथ नया प्लेसमेंट मेरे पास MyType का एक ऑब्जेक्ट है, जो एसएसई कारणों से 16-बाइट गठबंधन होना आवश्यक है। इसलिए, मैंने एक आवंटक लिखा और new ऑपरेटरों को अधिभारित किया। MyType में तरीके:ओवरलोडेड सामान्य नए ऑपरेटर

void MyType::copy_into(uint8_t* ptr) const { 
    new (reinterpret_cast<MyType*>(ptr)) MyType(*this); 
} 

जीसीसी मुझसे कहता है:

inline static void* operator new(size_t size) { 
    awesome::my_allocator<MyType,16> alloc; 
    return alloc.allocate(size); 
} 
inline static void* operator new[](size_t size) { return operator new(size); } 
inline static void operator delete(void* ptr) { 
    awesome::my_allocator<MyType,16> alloc; 
    alloc.deallocate(reinterpret_cast<MyType*>(ptr),0); //last arg ignored in my impl 
} 
inline static void operator delete[](void* ptr) { operator delete(ptr); } 

अब, कैश-मोहल्ला कारणों के लिए, मैं 64-बाइट गठबंधन स्मृति के किसी विशेष भाग में एक उदाहरण कॉपी-निर्माण करने के लिए की जरूरत है:

error: no matching function for call to ‘MyType::operator new(sizetype, MyType*)’ 

आईसीसी मुझसे कहता है:

error : function "MyType::operator new" cannot be called with the given argument list 
1>    argument types are: (unsigned __int64, MyType *) 

मैं यह समझ के रूप में, प्लेसमेंट नए ऑपरेटर सी ++ कार्यान्वयन द्वारा (<new>, जो मैं भी #include आईएनजी की कोशिश की? द्वारा या संभवतः) प्रदान की जाती है और केवल अपने तर्क देता है (new स्मृति उपलब्ध, और प्लेसमेंट बनाता है नया प्रोग्रामर कह रहा है कि दी गई स्मृति उपलब्ध है)।

मजे की बात है, त्रुटि करता नहीं होते हैं, जब (साधारण!) नई ऊपर परिभाषित ऑपरेटरों कक्षा में नहीं हैं। दरअसल, MyOtherType, जो उन्हें परिभाषित नहीं करता है, ठीक काम करता है।

प्रश्न: क्या चल रहा है? मुझे इसे कैसे ठीक करना चाहिए?

+0

शायद 2 पैरा लेने के लिए नया अधिभार - ऑपरेटर नया (आकार, संरेखण) - ताकि सामान्य, 1 परम समाचार प्रभावित न हों। यह कंपाइलर को अंतर्निहित प्रकार का उपयोग करके शिकायत कर सकता है। फेंक बनाम नोट्रो ओवरलोडिंग कुछ मुद्दों के कारण भी हो सकता है। –

+0

क्या यह एक अनुवाद इकाई में होता है? –

+0

प्लेसमेंट नया आमतौर पर "ऑब्जेक्ट को पहले से आवंटित मेमोरी में रखने" के लिए प्रयोग किया जाता है, शायद आपको अपने कार्यान्वयन के साथ-साथ प्लेसमेंट नए ऑपरेटर को अधिभारित करने की आवश्यकता है? – AJG85

उत्तर

8

चूंकि आपने अपनी कक्षा में operator new परिभाषित किया है, इसलिए आपको इसके प्लेसमेंट संस्करण का उपयोग करने के लिए वैश्विक new का उपयोग करना होगा।

#include <new> 

... 

::new (reinterpret_cast<MyType*>(ptr)) MyType(*this); 
+0

ने पुष्टि की कि यह समस्या को हल करता है। जैसा कि मैंने इसे समझ लिया है, वर्तमान नामस्थान में 'new' का अधिभार था, और इसलिए अधिभार को खोजने के लिए वैश्विक नामस्थान की जांच नहीं हुई (प्लेसमेंट 'नया') जो काम करता? – imallett

+0

मैं "वर्तमान नेमस्पेस में" नहीं कहूंगा। मैं "क्लास' में ही कहूंगा। फ़ंक्शन कॉल से मेल खाने में दो चरण शामिल हैं - नाम लुकअप और अधिभार संकल्प। यदि नाम किसी कक्षा या संलग्न नामस्थान में पाया जाता है, तो लुकअप समाप्त होता है। यदि लुकअप परिणाम कई कार्यों में होता है, तो केवल ओवरलोड रिज़ॉल्यूशन खेल में आता है। –

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