टेम्पलेट क्लास के अंदर टेम्पलेट फ़ंक्शन


119

मेरे पास यह कोड है:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo() {
            U a;
            a.invoke();
        }
};

मैं इसे इस रूप में चाहता हूं:

template <class T>
class MyClass {
    public:
        template <class U>
        void foo();
};

template <class T> /* ????? */
void MyClass<T>::foo() {
    U a;
    a.invoke();
}

मैं यह कैसे कर सकता हूं? सही सिंटैक्स क्या है?


केवल कक्षा घोषणा के अंदर फ़ंक्शन की घोषणा क्यों नहीं होती है (देखें कोडपैड.org/wxaZOMYW )? आप फ़ंक्शन को हेडर से बाहर
घोषित

@hiobs: एफडब्ल्यूआईडब्ल्यू, आप घोषणा को सीपीपी फ़ाइल में स्थानांतरित कर सकते हैं। उस ने कहा, मैंने केवल एक बार कुछ हैकरी करने के लिए ऐसा किया है। उस मामले में, यह जानना कि यह कैसे करना आवश्यक है।
थॉमस एडिंग

कभी-कभी किसी को फ़ंक्शन बॉडी द्वारा आवश्यक निर्भरता की परिभाषा के बाद, क्लास के बाहर फ़ंक्शन की परिभाषा को स्थानांतरित करना चाहिए। ऐसा तब होता है जब क्लास ए वर्ग बी का उपयोग करता है और बी भी ए का उपयोग करता है। उस स्थिति में आप ए और बी घोषित करते हैं, फिर ए और बी तरीकों को परिभाषित करते हैं।
व्हीजिल

जवाबों:


180

इसे लिखें:

template <class T>
template <class U>
void MyClass<T>::foo() { /* ... */ }

शून्य MyClass <T> :: foo <T> () ... धन्यवाद, मैंने पहले भी कोशिश की थी, लेकिन यह मेरे लिए काम नहीं करता है .. शायद मुझे स्वच्छ परियोजना करनी थी।
माइकल

@ user1074367: नहीं, मुझे लगता है कि जैसा मैं कह रहा हूं।
केरेके एसबी

3
वास्तव में मैंने लिखा था: टेम्पलेट <class T> टेम्पलेट <class U> void MyClass <T> :: foo () {U U; a.invoke (); } और यह काम करता है
माइकल

11
@ user1074367: इर ... हां, यही मैं जवाब में कहता हूं, गैर?
केरेके एसबी

8
@ माइक: सदस्य टेम्पलेट एक पूरी तरह से सामान्य और सामान्य बात है।
केरेक एसबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.