नीचे दिए गए नमूना कोड को संकलित नहीं करता है g ++ में संकलित नहीं किया गया है। लेकिन यह विजुअल स्टूडियो पर काम कर रहा है।यह कोड g ++
template<class C>
void D<C>::Bar()
{
int t = 0;
c.template Foo(&t);
}
नीचे दिए गए नमूना कोड को संकलित नहीं करता है g ++ में संकलित नहीं किया गया है। लेकिन यह विजुअल स्टूडियो पर काम कर रहा है।यह कोड g ++
template<class C>
void D<C>::Bar()
{
int t = 0;
c.template Foo(&t);
}
क्योंकि: यह संभव जी ++
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;
}
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)
। आम तौर पर, संभवतः कुछ मान्यताओं के साथ टेम्पलेट कोड लिखें (लेकिन कम नहीं)।
आप क्या त्रुटियां देख रहे हैं? – Nick