2009-06-09 7 views
119

मैं जानता हूँ कि यह एक टेम्पलेट समारोह बनाने के लिए संभव है:कक्षा के भीतर टेम्पलेट फ़ंक्शन कैसे बनाएं? (C++)

template<typename T> 
void DoSomeThing(T x){} 

और यह संभव एक टेम्पलेट वर्ग या नहीं:

template<typename T> 
class Object 
{ 
public: 
    int x; 
}; 

एक वर्ग बनाने के लिए एक टेम्पलेट के भीतर नहीं लेकिन यह संभव है , और उसके बाद उस वर्ग में एक फ़ंक्शन एक टेम्पलेट बनाते हैं? Ie:

//I have no idea if this is right, this is just how I think it would look 
class Object 
{ 
public: 
    template<class T> 
    void DoX(){} 
}; 

या सीमा तक कुछ, जहां कक्षा टेम्पलेट का हिस्सा नहीं है, लेकिन कार्य है?

उत्तर

88

आपका अनुमान सही एक है। केवल एक चीज आपको याद रखना है कि सदस्य फ़ंक्शन टेम्पलेट परिभाषा (घोषणा के अलावा) हेडर फ़ाइल में होना चाहिए, सीपीपी नहीं, हालांकि यह कक्षा घोषणा के शरीर में होना चाहिए अपने आप।

+3

और यह भी कि आप उन्हें विशेषज्ञ नहीं कर सकते हैं। :-( –

+7

बिल्कुल सही नहीं है। परिभाषा एक सीपीपी फ़ाइल में हो सकती है, जब तक इसे परिभाषित करने के बाद गैर-टेम्पलेट फ़ंक्शन/विधि से प्रत्येक अद्वितीय टेम्पलेट पैरामीटर एन-अपलेट के लिए एक बार कहा जाता है। –

+1

इसलिए मेरा " चाहिए "- इसे हेडर में रखते हुए इसे पूरा करने का सबसे आसान तरीका है। –

58

यहाँ देखें: Templates, template methods, सदस्य टेम्पलेट्स, सदस्य समारोह टेम्पलेट्स

class Vector 
{ 
    int  array[3]; 

    template <class TVECTOR2> 
    void eqAdd(TVECTOR2 v2); 
}; 

template <class TVECTOR2> 
void Vector::eqAdd(TVECTOR2 a2) 
{ 
    for (int i(0); i < 3; ++i) array[i] += a2[i]; 
} 
15

हां, टेम्पलेट सदस्य कार्य कई मौकों पर पूरी तरह से कानूनी और उपयोगी हैं।

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