2012-04-17 15 views
7

नीचे दिए गए नमूना कोड को संकलित नहीं करता है g ++ में संकलित नहीं किया गया है। लेकिन यह विजुअल स्टूडियो पर काम कर रहा है।यह कोड g ++

template<class C> 
void D<C>::Bar() 
{ 
    int t = 0; 
    c.template Foo(&t); 
} 
+5

आप क्या त्रुटियां देख रहे हैं? – Nick

उत्तर

9

क्योंकि: यह संभव जी ++

class Impl 
{ 
public: 
     template<class I> 
     void Foo(I* i) 
     { 

     } 
}; 

template<class C> 
class D 
{ 
public: 
     C c; 
     void Bar() 
     { 
       int t = 0; 
       c.Foo<int>(&t); 
     } 
}; 

int main() 
{ 
     D<Impl> d; 
     d.Bar(); 
     return 0; 
} 
4

Foo() एक टेम्पलेट पर निर्भर नाम है में टेम्पलेट वर्ग के अंदर खाका सदस्य समारोह का उपयोग करने के, तो आप मंगलाचरण के सामने template लगाने की जरूरत है प्रश्न में कथन टेम्पलेट पैरामीटर पर निर्भर करता है, संकलक को तत्कालता तक C आत्मनिरीक्षण की अनुमति नहीं है। आप इसे बताना होगा कि आप एक समारोह टेम्पलेट मतलब है:

c.template Foo<int>(&t); 

आप template वहाँ डाल नहीं है, तो बयान अस्पष्ट है। समझ के लिए, कल्पना निम्नलिखित C: (c.Foo<int) > &t: के रूप में यदि आप एक int करने के लिए एक const int की तुलना करें और &t में से कुछ पता करने के लिए कि का परिणाम की तुलना

class C { const int Foo = 5; }; 
... 
c.Foo<int>(&t); 

यह संकलक करने के लिए लग रहा है।

वास्तविक समाधान तथापि समारोह कॉल में स्पष्ट टेम्पलेट तर्क को छोड़ देते हैं करने के लिए है, और सिर्फ कार्य करें:

c.Foo(&t); 

यह भी मामले में सही है, जहां इस तरह के एक C एक गैर टेम्पलेट सदस्य है फ़ंक्शन Foo(int)। आम तौर पर, संभवतः कुछ मान्यताओं के साथ टेम्पलेट कोड लिखें (लेकिन कम नहीं)।

+0

धन्यवाद। यह काम कर रहा है। – nsa

+0

आप ' 'भी छोड़ सकते हैं, जिसके परिणामस्वरूप' c.Foo (& t) '। यह भी काम करना चाहिए। – evnu

+0

@evnu हां '' (जैसा कि मैंने अपने उत्तर में किया था) छोड़ने के लिए, 'टेम्पलेट' को छोड़ने के लिए नहीं (जैसा कि आपने अपनी टिप्पणी में किया था)। –

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