के साथ टेम्पलेटेड सदस्य फ़ंक्शन निम्न कोड मुझे त्रुटि क्यों देता है (g ++ 4.1.2)?टाइपपीफ रिटर्न वैल्यू
template<class A>
class Foo {
public:
typedef std::vector<A> AVec;
AVec* foo();
};
template<class A>
Foo<A>::AVec* Foo<A>::foo() { // error on this line
return NULL;
}
त्रुटि है:
error: expected constructor, destructor, or type conversion before '*' token
मैं कैसे (सही वापसी प्रकार के साथ) अन्यथा Foo<A>::foo()
समारोह को परिभाषित करना चाहिए?
आपका समाधान सही है, लेकिन मुझे स्पष्टीकरण के बारे में इतना यकीन नहीं है। जैसे ही संकलक 'Foo :: foo' तक पहुंचता है, यह वापस जायेगा और रिटर्न प्रकार को "ठीक" कर देगा। अगर ऐसा नहीं होता है तो यह परिभाषा के साथ 'foo' (कक्षा में) की घोषणा से मेल नहीं खाएगा (यानी यह चेतावनी देगा कि रिटर्न प्रकार अलग थे)। आपके लिंक के अनुसार 'दो-चरण' लुकअप के साथ इसका कोई लेना-देना नहीं है। –
मेरा मानना है कि मुझे दो चरण के लुकअप लिंक में गलती हुई थी। सही स्पष्टीकरण है - जब एक नेस्टेड आश्रित नाम (एक अज्ञात टेम्पलेट पैरामीटर पर निर्भर करता है, i.e Foo :: बार) पर निर्भर करता है, तो यह एक प्रकार का नहीं माना जाता है। आधार वर्ग सूची के दौरान एकमात्र अपवाद है। रिसीलर को रिटर्न प्रकार को ठीक करने के लिए - नहीं, टेम्पलेट इंस्टेंटेशन बहुत बाद में होता है; कोड – ASk