2011-04-11 23 views
7

मैं एक साधारण struct Wrapper, दो टेम्प्लेटेड असाइनमेंट ऑपरेटर भार के द्वारा प्रतिष्ठित है:खाका असाइनमेंट ऑपरेटर ओवरलोडिंग रहस्य

Wrapper<float> a, b; 
a = b; 

ba को बताए का उपयोग करेगा:

template<typename T> 
struct Wrapper { 

    Wrapper() {} 

    template <typename U> 
    Wrapper &operator=(const Wrapper<U> &rhs) { 
    cout << "1" << endl; 
    return *this; 
    } 
    template <typename U> 
    Wrapper &operator=(Wrapper<U> &rhs) { 
    cout << "2" << endl; 
    return *this; 
    } 
}; 

मैं तो ए और बी की घोषणा उपरोक्त से गैर-कॉन्स्ट टेम्पलेटेड असाइनमेंट ऑपरेटर अधिभार, और संख्या "2" प्रदर्शित होती है।

यह क्या पहेली मुझे है: यदि मैं c और d,

Wrapper<float> c; 
const Wrapper<float> d; 
c = d; 

घोषित करने और आवंटित dc को दो असाइनमेंट ऑपरेटर भार के न प्रयोग किया जाता है, और कोई उत्पादन प्रदर्शित होता है; तो डिफ़ॉल्ट प्रति असाइनमेंट ऑपरेटर लागू किया जाता है। d से c असाइन किए गए कॉन्स्ट अधिभारित असाइनमेंट ऑपरेटर का उपयोग क्यों नहीं करता है? या इसके बजाय, b को a डिफ़ॉल्ट प्रति असाइनमेंट ऑपरेटर का उपयोग क्यों करता है?

उत्तर

18

c करने के लिए d क्यों बताए है अतिभारित असाइनमेंट ऑपरेटर प्रदान की स्थिरांक का उपयोग नहीं?

परोक्ष-घोषित प्रति असाइनमेंट ऑपरेटर, जो इस प्रकार घोषित किया जाता है, अभी भी उत्पन्न होता है:

Wrapper& operator=(const Wrapper&); 

एक ऑपरेटर टेम्पलेट परोक्ष-घोषित प्रति असाइनमेंट ऑपरेटर की पीढ़ी को दबाने नहीं है। चूंकि तर्क (एक कॉन्स्ट-क्वालिफाइड Wrapper) इस ऑपरेटर के पैरामीटर के लिए एक सटीक मिलान है (const Wrapper&), यह ओवरलोड रिज़ॉल्यूशन के दौरान चुना जाता है।

ऑपरेटर टेम्पलेट चयनित नहीं है और कोई अस्पष्टता नहीं देखते क्योंकि है - सभी अन्य बातों के समान होने के बावजूद - एक nontemplate एक टेम्पलेट से अधिभार संकल्प के दौरान एक बेहतर मुकाबला नहीं है।

ba को डिफ़ॉल्ट प्रति असाइनमेंट ऑपरेटर का उपयोग क्यों नहीं करता है?

तर्क (एक गैर स्थिरांक योग्य Wrapper) कि परोक्ष-घोषित प्रति असाइनमेंट ऑपरेटर के लिए की तुलना में एक Wrapper<U>& (जिसमें से एक const Wrapper<U>&

+1

+1 * एक ऑपरेटर टेम्पलेट अंतर्निहित रूप से घोषित प्रति असाइनमेंट ऑपरेटर * की पीढ़ी को दबाने नहीं देता है। – Nawaz

6

लेता लेता ऑपरेटर टेम्पलेट के लिए एक बेहतर मुकाबला नहीं है सी ++ 03 मानक, §12.8/9:

एक उपयोगकर्ता के घोषित प्रति असाइनमेंट ऑपरेटर X::operator= ठीक एक साथ वर्ग X के एक गैर स्थिर गैर टेम्पलेट सदस्य समारोह है प्रकार X, X&, const X&, volatile X& या const volatile X& के पैरामीटर।

और §12।8/10:

यदि कक्षा परिभाषा स्पष्ट रूप से प्रतिलिपि असाइनमेंट ऑपरेटर घोषित नहीं करती है, तो उसे स्पष्ट रूप से घोषित किया जाता है।

तथ्य अपने operator= एक टेम्पलेट बनाता नहीं एक प्रति असाइनमेंट ऑपरेटर है, इसलिए क्लास 'निहित प्रति असाइनमेंट ऑपरेटर अभी भी संकलक द्वारा उत्पन्न होता है कि।

+0

यदि कोई कॉपी असाइनमेंट ऑपरेटर नहीं है तो यह क्या है? तो इसके बजाय आपको क्या करना चाहिए - बस एक CopyFrom फ़ंक्शन टेम्पलेट या ऐसा कुछ करें? –

+0

@ डेविड डोरिया: यह एक असाइनमेंट ऑपरेटर है, सिर्फ एक _copy_ असाइनमेंट ऑपरेटर नहीं है। – ildjarn

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