निम्नलिखित टेम्पलेट वर्ग पर विचार के साथ टेम्पलेट:सी ++ 'स्थिरांक'
template <typename T> class Function {
public:
virtual float eval(const T &x, const T &y) = 0;
};
'eval' समारोह के बाद से दो आदानों 'एक्स' का मूल्य संशोधित नहीं करना चाहिए और 'y', मैं उन्हें 'के रूप में डाल दिया स्थिरांक '। तो मैं निम्नलिखित वर्ग समारोह
class Foo1 : public Function <float*> {
public:
Foo1() : Function <float*>() {}
virtual float eval(const float* &x, const float* &y) { ... }
};
से ली गई जब मैं जी के साथ संकलन बनाने ++, मैं निम्नलिखित चेतावनी मिलती है:
hidden overloaded virtual function 'Function<float *>::eval' declared here: type mismatch at 1st parameter
('float *const &' vs 'const float *&')
virtual float eval(const T &x, const T &y) = 0;
और मैं वर्ग Foo1 का दृष्टांत नहीं कर सकते। कंपाइलर का कहना है कि समारोह 'eval' लागू नहीं किया गया है। संकलक को खुश करने के लिए, व्युत्पन्न वर्ग के रूप में होना चाहिए इस प्रकार है:
class Foo2 : public Function <float*> {
public:
Foo2() : Function <float*>() {}
virtual float eval(float* const &x, float* const &y) { ... }
};
foo2 :: eval समारोह के बजाय 'स्थिरांक नाव *' के प्रकार 'नाव * स्थिरांक' दो पैरामीटर उपयोग करता है। दूसरे शब्दों में, Foo2 :: eval arrays 'x' और 'y' की सामग्री को संशोधित कर सकता है। यह वह नहीं है जिसकी मुझे चाहत है।
मैं इस प्रकार टेम्पलेट वर्ग 'समारोह' को बदलने की कोशिश की है:
virtual float eval(T const &x, T const &y) = 0;
लेकिन वर्ग Foo1 अभी भी काम नहीं करता है, वर्ग foo2 पिछले मामले में के रूप में काम करता है।
- तो ऐसा लगता है कि या तो 'स्थिरांक टी & एक्स' या टेम्पलेट कक्षा में 'टी स्थिरांक & एक्स' व्युत्पन्न वर्ग में निकलता है 'नाव * स्थिरांक & एक्स'। क्या ये सही है?
- यदि मैं व्युत्पन्न कक्षा में 'कॉन्स्ट फ्लोट * & x' (या 'कॉन्स्ट फ्लोट * एक्स') चाहता हूं, तो मेरा टेम्पलेट क्लास फ़ंक्शन क्या होना चाहिए?
धन्यवाद।