2013-10-03 9 views
14

का कन्स्ट्रक्टर कॉपी करें मैंने पढ़ा है कि टेम्पलेट कॉपी-कॉन कभी भी डिफ़ॉल्ट प्रतिलिपि निर्माता नहीं है, और टेम्पलेट असाइनमेंट-ओप कभी कॉपी कॉपी ऑपरेटर नहीं है।टेम्पलेट वर्ग

मैं नहीं समझ सकता है क्यों इस प्रतिबंध की जरूरत है और सीधे ideone और वापसी एक test program लेकिन यहाँ कॉपी निर्माता पर बुलाया जाता है कभी नहीं आगे googling मैं templatized निर्माता में आए और कहा कि कोशिश की करने के लिए ऑनलाइन किया गया है लेकिन अभी भी यह कॉल निर्माता नकल कभी नहीं ।

#include <iostream> 
using namespace std; 

template <typename T> class tt 
{ 
    public : 
    tt() 
    { 
     std::cout << std::endl << " CONSTRUCTOR" << std::endl; 
    } 
    template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << " OPERATOR" << std::endl;} 
    template <typename U> tt(const tt<U>& that) 
    { 
     std::cout << std::endl << " COPY CONSTRUCTOR" << std::endl; 
    } 
}; 


tt<int> test(void) 
{ 
    std::cout << std::endl << "  INSIDE " << std::endl; tt<int> a; return a; 
} 

int main() { 
    // your code goes here 
    tt<int> a ; a = test(); 

    return 0; 
} 

क्या कोई मुझे इस प्रतिबंध को डालने और टेम्पलेट वर्ग की प्रतिलिपि बनाने के तरीके के बारे में बता सकता है।

धन्यवाद

+2

[कॉपी-एलिशन।] (Http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – 0x499602D2

+1

कोई "डिफ़ॉल्ट प्रति कन्स्ट्रक्टर" नहीं है। केवल * एक * कॉपी कन्स्ट्रक्टर है। एक टेम्पलेट कभी नहीं है। –

+0

मैंने कोड संपादित किया और इसे आदर्श में चलाया लेकिन अभी भी कन्स्ट्रक्टर को कॉपी नहीं किया गया है। लेकिन मैं इस प्रतिबंध के पीछे कारण समझने में भी सक्षम नहीं हूं – anonymous

उत्तर

18

सख्त नियम क्या एक प्रतिलिपि निर्माता (सीएफ सी ++ 11, 12.8) का गठन किया हैं:

  • यह एक टेम्पलेट नहीं है।

  • एक वर्ग T के लिए, इसके पहले तर्क प्रकार T & या T const & या T volatile & या T const volatile & होना आवश्यक है।

  • यदि इसमें एक से अधिक तर्क हैं, तो आगे के तर्कों में डिफ़ॉल्ट मान होना चाहिए।

आप एक प्रति निर्माता की घोषणा नहीं करते हैं तो फ़ॉर्म T::T(T const &) की एक प्रति निर्माता है परोक्ष आप के लिए घोषित कर दिया। (यह वास्तव में परिभाषित किया जा सकता है या नहीं, और यदि इसे परिभाषित किया गया है तो इसे हटाए गए के रूप में परिभाषित किया जा सकता है।)

(सामान्य ओवरलोड रिज़ॉल्यूशन नियमों का अर्थ है कि आपके पास अधिकतम चार प्रतिलिपि बनाने वाले, प्रत्येक सीवी-योग्यता के लिए एक हो सकता है ।)

के स्थान पर && के साथ चालकों के लिए समान नियम हैं।

17

मैं क्यों इस लिए कि यह कैसे है है, लेकिन यहाँ पर कोई टिप्पणी नहीं कर सकते हैं कि कैसे आप एक प्रति निर्माता और एक वर्ग टेम्पलेट के लिए असाइनमेंट ऑपरेटर लिखें:

template <class T> 
    class A 
    { 
     public: 
     A(const A &){} 
     A & operator=(const A& a){return *this;} 
    }; 

और बस इतना ही।
यहां की चाल यह है कि A एक टेम्पलेट है, जब आप इसे कक्षा के अंदर A (जैसे फ़ंक्शन हस्ताक्षर में) के रूप में संदर्भित करते हैं, तो इसे पूर्ण प्रकार A<T> माना जाता है।

+1

मैंने पाया कि ए (कॉन्स ए और) {} का उपयोग करने से कोई त्रुटि नहीं होती है ... – Daniel

+4

@Daniel ऐसा इसलिए है क्योंकि ' 'कक्षा के पूर्ण प्रकार को भी संदर्भित करता है, 'ए 'सिर्फ एक शॉर्टेंड है जिसे आप कक्षा के अंदर उपयोग कर सकते हैं। – SirGuy

+0

@ निकोलईनीटा यह नहीं है कि यहां पहली टिप्पणी क्या कह रही है? – SirGuy

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