मैं विजुअल स्टूडियो से जीएनयू/लिनक्स पर जी ++ में अपनी खुद की lib को बंद करने की कोशिश कर रहा हूं, और मुझे टेम्पलेट संकलन के साथ कुछ समस्याएं आ रही हैं। दरअसल, विज़ुअल सी ++ में, टेम्पलेट केवल तब उत्पन्न होते हैं जब उन्हें स्पष्ट रूप से कोड में उपयोग किया जाता है, जबकि ऐसा लगता है (मेरी त्रुटियों से) कि g ++ पहले उपयोग किए जाने से पहले टेम्पलेट की सामग्री का मूल्यांकन करता है। बल्कि पहले की तुलना मेंमैं जी + + एमआईएमसी ++ के टेम्पलेट तत्काल व्यवहार की नकल कैसे कर सकता हूं?
error: incomplete type ‘X’ used in nested name specifier
... क्योंकि मैं टेम्पलेट कोड के बाद कुछ वर्गों में शामिल हैं,: यह निम्न त्रुटि का परिणाम है। मैं क्रॉस-उपयोग संघर्ष के कारण ऐसा कर रहा हूं।
यह समझा जाता है कि विज़ुअल सी ++ उपयोग पर टेम्पलेट की सामग्री को हल करने का प्रयास नहीं करता है, और g ++ जितनी जल्दी हो सके संकल्प करता है।
class MyClass;
template<class _Ty>
void func(MyClass* a_pArg)
{
a_pArg->foo();
};
(_Ty नहीं किया जाता है, लेकिन यह कोई फर्क नहीं पड़ता है, यह सिर्फ समस्या को समझाने के लिए है)
उस मामले विजुअल C++ संकलन हैं (भले ही MyClass
predeclared नहीं है) में, जबकि g ++ नहीं होगा, क्योंकि MyClass
पूरी तरह से घोषित नहीं किया गया है।
क्या उपयोग करने के लिए टेम्पलेट्स को तुरंत चालू करने के लिए g ++ बताने का कोई तरीका है?
बस स्पष्ट होना; आप कह रहे हैं कि * * MyClass' घोषित करें, फिर फ़ंक्शन टेम्पलेट को परिभाषित करें, फिर * * MyClass * को परिभाषित करें, और फिर अंत में टेम्पलेट को तुरंत चालू करें? –
@ जुइसबॉक्स: पुhew! इस सवाल पर कुछ सर्जरी हुई। अगर मैंने कुछ तोड़ दिया तो कृपया मुझे बताएं। :) –
@ जुइसबॉक्स: ध्यान दें कि अंडरस्कोर से शुरू होने वाले नामों का उपयोग (उदा। आपका '_Ty') एक बुरा विचार है क्योंकि वे कई मामलों में कार्यान्वयन के लिए आरक्षित हैं। –