पर विचार करें निम्न कोड से विरासत में मिली चर तक पहुंचना:टेम्प्लेटेड माता पिता वर्ग
template<class T> class Foo
{
public:
Foo() { a = 1; }
protected:
int a;
};
template<class T> class Bar : public Foo<T>
{
public:
Bar() { b = 4; };
int Perna(int u);
protected:
int b;
};
template<class T> int Bar<T>::Perna(int u)
{
int c = Foo<T>::a * 4; // This works
return (a + b) * u; // This doesn't
}
जी ++ 3.4.6, 4.3.2 और 4.1.2 त्रुटि दिखा सकते हैं
test.cpp: In member function `int Bar<T>::Perna(int)':
test.cpp:25: error: `a' was not declared in this scope
जी ++ 2.96 और MSVC 6, 7 , 7.1, 8 और 9 इसे स्वीकार करते हैं, कम से कम पुराने इंटेल और एसजीआई सी ++ कंपाइलर्स करते हैं।
नई GNU सी ++ संकलक मानक का पालन करना या नहीं है? यदि वे करते हैं, तो उत्तराधिकारी वर्ग के पीछे तर्क क्या है जो संरक्षित विरासत सदस्य चर को देखने में सक्षम नहीं है?
इसके अलावा, अगर वहाँ
int A() { return a; }
फू में
, मैं त्रुटि मिलती है
test.cpp:25: error: there are no arguments to A that depend on a template parameter, so a declaration of A must be available
test.cpp:25: error: (if you use -fpermissiveâ, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
जब मैं बार के एक सदस्य समारोह में इसका इस्तेमाल करने की कोशिश करते हैं। मुझे यह उत्सुकता भी मिलती है: बार को फू विरासत में मिला है, इसलिए मुझे लगता है कि यह स्पष्ट है कि बार (ए) में बार (ए)) है।
धन्यवाद। मैं अपनी आस्तीन रोल करने और कोड बदलने जा रहा हूं। –
मेरा मानना है कि आपको कक्षा स्तर पर उपयोग कथन करना है, यानी टेम्पलेट बार: सार्वजनिक Foo {Foo :: ए का उपयोग करना; ...}; –