2012-10-09 20 views
15

घोषित करते समय" अपरिभाषित टेम्पलेट का लागू तत्कालता "मुझे कुछ कोड मिला है जिसमें मुझे टेम्पलेट क्लास को अग्रेषित करने की घोषणा की जा रही है (या कम से कम, आगे की घोषणा करना मेरे लिए चीजों को बहुत आसान बना देगा। ..)। मैं इस समस्या मैं बहुत हो रही है का एक सरलीकृत संस्करण में लिखा है मैं इसे यहाँ प्रदर्शित कर सकते हैं:"टेम्पलेट क्लास

template<bool> 
class MyTemplateClass; 

int main(int argc, char* argv[]) 
{ 
    MyTemplateClass<false> myTemp; // error here 
    myTemp.GetTheValue(); 
    return 0; 
} 

template<bool bShouldMult> 
class MyTemplateClass 
{ 
    int m_myint; 
    float m_myfloat; 

public: 
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {} 
    float GetTheValue() 
    { 
     return m_myint * (bShouldMult ? m_myfloat : 1.0f); 
    } 

}; 

त्रुटि मैंने टिप्पणी की लाइन में हो रही है:

Error - implicit instantiation of undefined template 'MyTemplateClass<false>' 

क्या अन्य विस्तार क्या मुझे MyTemplateClass की अगली घोषणा में शामिल करने की आवश्यकता है? चूंकि त्रुटि अगली पंक्ति से नहीं आ रही है, इसलिए मुझे लगता है कि यह इस तथ्य के कारण नहीं है कि विधि अपरिभाषित है। मैं जिस कंपाइलर का उपयोग कर रहा हूं वह एलएलवीएम/क्लैंग है, और मै मैक पर संकलन कर रहा हूं।

उत्तर

13

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

MyTemplateClass<false> *myTempPtr; // No error here 

दुर्भाग्य से (लेकिन अप्रत्याशित रूप से नहीं) इस त्रुटि को अगली पंक्ति में ले जाता है। उस सूचक को प्रारंभ करने की समस्या बनी हुई है: एक बार जब आप new MyTemplateClass<false> का आह्वान करने का प्रयास करते हैं, तो आपको एक त्रुटि दिखाई देगी।

आपको अपने कोड की उपयोग से पहले टेम्पलेट की परिभाषा को स्थानांतरित करने के लिए अपने कोड को पुन: व्यवस्थित करने की आवश्यकता है। यह कुछ हद तक कठिन हो सकता है, लेकिन इसके चारों ओर कोई रास्ता नहीं है: संकलक को उस बिंदु पर पूरी परिभाषा की आवश्यकता होती है जहां आप अपने टेम्पलेट को तुरंत चालू करना और इसकी विधियों को कॉल करना शुरू करते हैं।

0

यह मेरी समझ से है कि आप कुछ घोषित नहीं कर सकते हैं और फिर इसे अपने स्टैक (टेम्पलेट या नहीं) में तुरंत चालू कर सकते हैं।

इसके अलावा, मैं टेम्पलेट वर्ग

19

क्या आप #include कुछ भूल गए थे?

मैं

#include <array> 

को भूल के बाद यह मिल गया जब एक std::array

का उपयोग कर
संबंधित मुद्दे