2009-05-24 30 views
9

के साथ टेम्पलेटेड सदस्य फ़ंक्शन निम्न कोड मुझे त्रुटि क्यों देता है (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() समारोह को परिभाषित करना चाहिए?

उत्तर

17

यह एक समस्या है जिसे "two-stage lookup" कहा जाता है। असल में, Afoo() की परिभाषा में एक टेम्पलेट पैरामीटर है, इसलिए संकलक को पहली बार टेम्पलेट को पार्स करते समय पता नहीं हो सकता है, चाहे Foo<A>::AVec एक प्रकार या यहां तक ​​कि मौजूद है (उदाहरण के लिए, Foo<Bar> का विशेषज्ञता हो सकता है जिसमें टाइपिफ़ में बिल्कुल शामिल नहीं है)। यह केवल तभी होगा जब यह टेम्पलेट तत्काल के दौरान होता है, जो बाद में होता है - और इस चरण के लिए बहुत देर हो चुकी है।

सही तरीके से संकेत मिलता है कि यह एक प्रकार है typename कीवर्ड का उपयोग करने के होगा:

template<class A> 
class Foo { 
public: 
    typedef std::vector<A> AVec; 
    AVec* foo(); 
}; 

template<class A> 
typename Foo<A>::AVec* Foo<A>::foo() { 
    return NULL; 
} 
-1

मुझे वास्तव में पता नहीं है, लेकिन कक्षा के बाहर टाइपपीफ डालने का प्रयास करें।

13

सामान्य typename मुद्दा:

template<class A> 
typename Foo<A>::AVec* Foo<A>::foo() { // error on this line 
    return NULL; 
} 

याद रखें: एक सामान्य नियम के रूप में, सभी योग्य टेम्पलेट पैरामीटर पर निर्भर होने वाले नामों को उनके सामने typename की आवश्यकता होती है।

+0

पर कंपाइलर द्वारा किए गए पहले स्कैन के दौरान त्रुटि प्राप्त होती है, बेस क्लास सूची और बेस क्लास प्रारंभिकरण को छोड़कर जहां टाइपनाम को इसकी अनुमति नहीं है। –

+1

@Johan तय। । –

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