2010-11-10 13 views
13

के साथ टेम्पलेट त्वरण मैंने संदर्भ-से-संदर्भ समस्या और this संकल्प के बारे में कुछ सुना है। मैं सी ++ कमेटी शब्दावली के साथ बहुत अच्छा नहीं हूं, लेकिन मैं समझता हूं कि लिंक में "डीआर टू ड्रा" एनोटेशन का अर्थ है कि यह वर्तमान व्याख्या है कि मानक-अनुरूप कंप्यूटर्स का पालन करना चाहिए।सी ++ - संदर्भ प्रकार

template <typename T> 
struct C { 
    void f(T&) { } 
    void f(const T&) { } 
}; 

int main() { 
    C<int> x;  // OK 
    C<int&> y;  // compile error: f cannot be overloaded 
    C<const int&> z; // compile error: f cannot be overloaded 
} 

मुझे समझ में त्रुटि C<const int&> मामले में: डॉ # से नियमों का उपयोग कर 106 हम एक ही हस्ताक्षर च के साथ दो विधियों (स्थिरांक पूर्णांक & मिल

मैं इस नमूना कोड है कि मैं नहीं समझ सकता है)। मुझे क्या नहीं मिला C<int&> केस: क्या यह C<int> (कम से कम स्ट्रॉस्ट्रप के संकल्प के अनुसार) के समान कोड उत्पन्न नहीं करना चाहिए?

+0

आप किस कंपाइलर का उपयोग कर रहे हैं? –

+0

बनाम 2010 एक ही त्रुटि उत्पन्न करता है (जबकि बनाम 2008 एक रिफ-टू-रेफ अवैध त्रुटि रिपोर्ट करता है) –

+0

इस तथ्य के साथ कुछ करने के लिए है कि गतिशील/स्थैतिक कलाकारों को संदर्भों के संदर्भों की अनुमति नहीं है।"'doubl और d = dynamic_cast (someintvariable)' '' static_cast 'की ओर जाता है: एमएसवीसी –

उत्तर

3

डीआर का मतलब केवल "दोष रिपोर्ट" है, और मेरे ज्ञान के लिए, वर्णित संकल्प ने इसे मानक तक (अभी तक) नहीं बनाया है। इस कारण से, मेरा मानना ​​है कि कड़ाई से अनुरूप सी ++ 03 कार्यान्वयन को इस कोड को संकलित नहीं करना चाहिए क्योंकि यह संदर्भ के संदर्भ का निर्माण कर रहा है।

[संपादित करें] इस मुद्दे पर अभी एक nice answer मिला है।

+0

एक और दिलचस्प पढ़ा गया: http://groups.google.com/group/comp.std.c++/browse_thread/thread/ac9ba419a0d95b2d – icecrime

+0

यह एक अच्छा पकड़ है !!! –

+0

धन्यवाद, यह मेरे और स्टीव टाउनसेंड द्वारा वर्णित सभी मामलों में संकलक के व्यवहार को अच्छी तरह से बताता है। – jhh

1
दिलचस्प बात यह है

, जब मैं अपने कोड (विजुअल C++ 10 एक्सप्रेस) मैं त्रुटियों मिलता है, लेकिन यह भी जब मैं इस सरल मामले की कोशिश संकलन:

int main(int argc, char* argv[]) 
{ 
    C<int> x;  // OK 
    C<const int> x1; // error C2535: 'void C<T>::f(T &)' : member function 
        // already defined or declared 
    return 0; 
} 

रेफरी करने वाली रेफरी डॉ में परिभाषित टूट की तरह लगता है आपने बताया कि const रेफरी टेम्पलेट के भीतर एक साधारण गैर-कॉन्स रेफरी बन जाता है। इसके साथ मेरी समस्या यह है कि मुझे समझ में नहीं आता कि दूसरा f क्यों नज़रअंदाज़ नहीं किया गया है।

अगर मैं सी बदलें ताकि दूसरे च है const -qualified, यह अब संकलित:

template <typename T> 
struct C { 
    void f(T&) { } 
    void f(const T& t) const {} 
}; 

निहितार्थ हो रहा है कि जब Cconst कुछ भी (रेफरी या नहीं), दो के साथ instantiated है C::f ओवरलोड बस समान हैं, और परिणाम संकलन-समय डुप्लिकेट पहचान में परिणाम।

शायद मेरे से कोई भी स्मार्ट यहां श्रृंखला को और अधिक निश्चित रूप से समझ सकता है।

संपादित करें: प्रतिबिंब पर, यह नहीं यहाँ आश्चर्य की बात है कि T = const int& परिणाम f भार के में हूबहू है यही कारण है कि संकलक कह रहा है

void f(const int&) {} 

के रूप में instantiated जा रहा है:

#include "stdafx.h" 

template <typename T> 
struct C { 
    void f(T&) { } 
    void f(const T&) { } 
}; 

int main() { 
    C<const int&> z; // compile error: f cannot be overloaded 
    return 0; 
} 

इस त्रुटि देता है:

1>test.cpp(6): error C2535: 'void C<T>::f(T)' : member function already 
    defined or declared 
1>   with 
1>   [ 
1>    T=const int & 
1>   ] 
1>   test.cpp(5) : see declaration of 'C<T>::f' 
1>   with 
1>   [ 
1>    T=const int & 
1>   ] 
1>   test.cpp(10) : see reference to class template instantiation 
       'C<T>' being compiled 
1>   with 
1>   [ 
1>    T=const int & 
1>   ] 

मैं भी नहीं हूँ आश्वस्त है कि इस के साथ डीआर के साथ कुछ भी करना है।

+0

अब मुझे लगता है कि यह अजीब है ... वास्तव में आपके उदाहरण में रिफ-टू-रेफ के साथ कुछ लेना देना नहीं है; जबकि सी में इस सवाल में कुछ भी नहीं है ... –

+0

@lz_prgmr - मुझे यह भी यकीन नहीं है कि मेरा उदाहरण समान संकलक त्रुटि उत्पन्न करने के अलावा प्रासंगिक है। मैं कुछ के साथ चर्चा को स्थानांतरित करने की उम्मीद कर रहा हूं, सब कुछ है। मुझे लगता है कि अगर कोई विशेष 'टी' वास्तव में 'एफ' ओवरलोड दोनों को हल करता है, तो संकलक त्रुटि की अपेक्षा की जाती है - यह समान रूप से अच्छे मैच को अनदेखा नहीं करेगा। वे प्रत्येक को 'समान रूप से अच्छा' क्यों माना जाता है, यह सवाल मैं जवाब नहीं दे सकता। –

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