2017-02-21 8 views
6

मैंने सोचा कि यह एक बहुत ही बुनियादी सवाल है लेकिन मुझे कुछ ऐसा नहीं मिला।टेम्पलेट पैरामीटर स्थिरता क्यों खो रहा है?

निम्नलिखित कोड संकलन नहीं करता है (C3668)

struct Param 
{ 
    int a; 
    int b; 
}; 

template <typename T> 
struct Foo 
{ 
    virtual void doStuff (const T) const = 0; 
}; 

struct Bar : public Foo<Param&> 
{ 
    void doStuff (const Param &) const override 
    { 
     /*...*/ 
    } 
}; 

यह

void doStuff (const Param &) 

से स्थिरांक मैं यहाँ क्या याद आ रही है हटाने के बाद संकलन होगा? मैं अपने इंटरफेस घोषणा के साथ const Param& in Foo::doStuff पर लागू करने की अपेक्षा करता हूं। इसके बजाय इसे हटाया जा रहा है।

+1

फ़ंक्शन घोषणाओं में शीर्ष-स्तरीय कॉन्स्ट को अनदेखा नहीं किया जाता है। इसके अलावा, 'कॉन्स टी' का मतलब 'परम और कॉन्स' होगा, न कि परम परम और '। –

उत्तर

5

const सिर्फ एक टेक्स्ट प्रतिस्थापन नहीं है, यह पूरे प्रकार T पर लागू होता है।

यदि TParam&, const T और const Param& समकक्ष नहीं हैं; पूर्व Param& const जैसा ही है, जो Param& के बराबर है।
यदि आप कम आम "पोस्टफिक्स-कॉन्स" फ़ॉर्म लिखते हैं तो यह अधिक स्पष्ट हो जाता है: T const और Param const &T क्या है इसके बावजूद समकक्ष नहीं हो सकता है।

इस प्रकार, आपका "ओवरराइड" कुछ भी ओवरराइड नहीं करता है और आपको संकलन त्रुटि मिलती है।

1

जब आप

doStuff (const T) 

है यह एक ही प्रकार के रूप में

doStuff (const Param &) 

पहले एक एक निरंतर जो कुछ भी टी इस मामले में इतना है कि आप एक टी करने के लिए एक निरंतर संदर्भ की जरूरत नहीं है जो वास्तव में समझ में नहीं आता है क्योंकि संदर्भों को रिबाउंड नहीं किया जा सकता है। बाद में यह const Param का संदर्भ है।

क्या तुम कर सकते हो बदलने है

struct Bar : public Foo<Param&> 

को
struct Bar : public Foo<Param> 

और फिर

virtual void doStuff (const T) const = 0; 

को

virtual void doStuff (const T&) const = 0; 
1

समस्या कॉन्स के साथ नहीं है। प्रोब्राइड ओवरराइड के साथ है। ओवरराइड के साथ घोषित सदस्य फ़ंक्शन बेस क्लास सदस्य

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