2013-02-11 18 views
5

मैं निम्नलिखित फार्म के कोड का एक टुकड़ा के साथ एक समस्या है में नाकाम रहने के:टेम्पलेट सदस्य समारोह के लिए कॉल को संकलित करने के

http://codepad.org/ZR1Std4k

मैं:

template<class Type> 
class Class1 { 
public: 
    template<class TypeName1> TypeName1* method1() const {return 0;} 
}; 

struct Type1{}; 
struct Type2{}; 

class Class2 { 
public: 
    template<typename TypeName1, typename TypeName2> 
    int method2() { 
     Class1<TypeName2> c; 
     c.method1<TypeName1>(); 
     return 0; 
    } 

    int method1() { 
     return method2<Type1, Type2>(); 
    } 
}; 

int 
main() { 
    Class2 c; 
    return c.method1(); 
} 

codepad पर संकलक के साथ संकलित जब निम्न त्रुटि:

t.cpp: In member function 'int Class2::method2()': Line 15: error: expected primary-expression before '>' token compilation terminated due to -Wfatal-errors.

अपमानजनक रेखा का आविष्कार है टेम्पलेट सदस्य समारोह:

c.method1<TypeName1>(); 

उत्तर

11

आप template कीवर्ड जब आप एक सदस्य समारोह टेम्पलेट लागू कर रहे हैं का उपयोग करना चाहिए और आप एक आश्रित नाम है, या method1 के रूप में एक "कम c और < के एक सदस्य चर के रूप में पार्स किया जाएगा की तुलना में "प्रतीक:

c.template method1<TypeName1>(); 

@DrewDormann सही ढंग से बताते हैं के रूप में, कारण है कि template कीवर्ड आवश्यक है कि Class1 वर्ग टेम्पलेट की एक विशेषज्ञता, विशेष प्रकार के तर्क के लिए मौजूद हो सकता है प्रदान की है, जहां 0,123,को फ़ंक्शन टेम्पलेट की बजाय सदस्य चर के रूप में परिभाषित किया गया है। इस प्रकार, संकलक को method1 को फ़ंक्शन टेम्पलेट के नाम के रूप में स्पष्ट रूप से निर्देशित किया जाना चाहिए यदि यह मामला नहीं है।

+0

अच्छा जवाब। भयानक भाषा –

+0

एक आकर्षण की तरह काम किया, 5 मिनट में स्वीकार करेंगे! –

+2

+1। विशेष रूप से इस संदर्भ में, भले ही 'कक्षा 1' अग्रेषित हो, फिर भी यह नहीं माना जा सकता कि 'कक्षा 1 :: method1' एक टेम्पलेट फ़ंक्शन है। अन्यथा 'कक्षा 1' का एक टेम्पलेट विशेषज्ञता अन्यथा साबित हो सकता है। –

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

  • कोई संबंधित समस्या नहीं^_^