2012-09-24 35 views
5

निम्नलिखित कोड को देखते हुए:व्युत्पन्न ब्रेक स्थानांतरण करने के लिए टेम्पलेट विधि संकलन

template<typename T> 
class A 
{ 
public: 
    T t; 
}; 

class B 
{ 
public: 
    void foo(int i) {} 

    template<typename T> 
    void foo(A<T>& a) {} 
}; 

int main() 
{ 
    A<int> a; 
    B  b; 

    b.foo(a ); 
    b.foo(a.t); 
} 

यह संकलित करता है तथा ठीक काम करता है; B::foo() के सही अधिभारित संस्करणों को चुना गया है और a और a.t के लिए बुलाया गया है।

अब मैं एक नया वर्ग C जो B से निकला लागू करने और B से बाहर है और C में ::foo() के टेम्पलेट संस्करण के लिए कदम:

template<typename T> 
class A 
{ 
public: 
    T t; 
}; 

class B 
{ 
public: 
    void foo(int i) {} 
}; 

class C: public B 
{ 
public: 
    template<typename T> 
    void foo(A<T>& a) {} 
}; 

int main() 
{ 
    A<int> a; 
    C  c; 

    c.foo(a ); // Fine 
    c.foo(a.t); // Error 
} 

और अब कोड अब और संकलन नहीं होंगे। विजुअल स्टूडियो 2005 बताते हुए है:

error C2784: 'void C::foo(A<T> &)' : could not deduce template argument for 'A<T> &' from 'int' 

वास्तव में, इस त्रुटि में किसी भी int मूल्य परिणामों के साथ C::foo() बुला। यह लगभग int के लिए विधि ओवरलोड की तरह लगता है टेम्पलेट अधिभार द्वारा छुपाया जा रहा है।

ऐसा क्यों हो रहा है? क्या यह विजुअल स्टूडियो 2005 के कंपाइलर के साथ कुछ मुद्दा है? दुर्भाग्यवश, मैं अभी किसी अन्य कंपाइलर पर इसका परीक्षण नहीं कर सकता।

किसी भी जानकारी की सराहना की जाती है।

उत्तर

5

का प्रयोग करें यह लगभग पूर्णांक के लिए विधि अधिभार टेम्पलेट अधिभार से छुपाई जा रही है की तरह लगता है।

बिल्कुल! आप वर्ग सेल्सियस के लिए एक घोषणा का उपयोग कर जोड़ने की जरूरत:

class C: public B 
{ 
public: 
    using B::foo; 
    template<typename T> 
    void foo(A<T>& a) {} 
}; 

जब आप एक व्युत्पन्न वर्ग में एक सदस्य समारोह की घोषणा, एक ही नाम के साथ आधार वर्ग में सभी सदस्य कार्यों छिपे रहते हैं। देखें आईएसओ/आईईसी की §3.3.10/3 14882: 2011:

एक व्युत्पन्न वर्ग में एक सदस्य (खंड 10) की घोषणा के एक ही नाम के एक आधार वर्ग के एक सदस्य की घोषणा छुपाता है; 10.2 देखें।

2

यह छुपा रहा है, कोई ओवरलोडिंग नहीं है।

class C: public B 
{ 
public: 
    using B::foo; 
    template<typename T> 
    void foo(A<T>& a) {} 
}; 
1

सही, आधार फ़ंक्शन छिपा है। यह वास्तव में इसके लिए उचित शब्द है। इसे 0hकी कक्षा परिभाषा में using B::foo; जोड़ें।

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

  • कोई संबंधित समस्या नहीं^_^