2012-07-01 7 views
8

Possible Duplicate:
GCC problem : using a member of a base class that depends on a template argumentस्थिरांक टेम्पलेट वर्गों

में परिभाषित मैंने सोचा कि मैं सी से परिचित था ++, लेकिन जाहिरा तौर पर काफी परिचित नहीं।
समस्या तब होती है जब आप किसी टेम्पलेट क्लास में निरंतर परिभाषित करते हैं, तो आप उस कक्षा से प्राप्त होने वाले नए वर्गों में निरंतर उपयोग कर सकते हैं, लेकिन नए टेम्पलेट कक्षाएं जो इससे प्राप्त होती हैं।

उदाहरण के लिए, जीसीसी कहते

test.h:18: error: ‘theconstant’ was not declared in this scope

जब मैं इस (सरलीकृत) हेडर फाइल को संकलित करने का प्रयास करें:

#pragma once 

template <typename T> class base 
{ 
    public: 
    static const int theconstant = 42; 
}; 

class derive1 : public base<size_t> 
{ 
    public: 
    derive1(int arg = theconstant) {} 
}; 

template<typename T> class derive2 : public base<T> 
{ 
    public: 
    derive2(int arg = theconstant) {} // this is line 18 
}; 

तो समस्या यह है कि एक वर्ग, derive1, ठीक संकलित है, लेकिन अन्य वर्ग, derive2, जो एक टेम्पलेट विशेषज्ञता है, नहीं करता है।
अब शायद जीसीसी की त्रुटि पर्याप्त स्पष्ट नहीं है, लेकिन मुझे समझ में नहीं आता कि derive2 में कन्स्ट्रक्टर derive1 में से एक से अलग दायरा क्यों होगा।
यदि यह महत्वपूर्ण है, तो यह हेडर फ़ाइल के संकलन के दौरान होता है, न कि derive2<type> के किसी ऑब्जेक्ट को तुरंत चालू करते समय।

मुझे यह भी पता है कि इस संकलन को बदलने के लिए क्या बदलना है, इसलिए मैं वास्तव में कोड के एक-पंक्ति के टुकड़े उत्तर के रूप में नहीं देख रहा हूं। मैं समझना चाहता हूं क्यों ऐसा होता है! मैंने वेब पर खोज करने की कोशिश की, लेकिन स्पष्ट रूप से मैं सही खोज तर्कों का उपयोग नहीं कर रहा हूं।

+0

एफडब्ल्यूआईडब्ल्यू, यह वही कोड वीसी ++ 2010 में ठीक है। यह जीसीसी में एक बग हो सकता है ... – dsharlet

+0

'derive2 (int arg = base :: theconstant) {} 'ठीक संकलित करता है। – jrok

+0

@ डीशर्लेट - जीसीसी के हिस्से पर एक बग नहीं, जैसा कि स्पेक में वर्णित है। – Flexo

उत्तर

2

मैं बहुत यकीन है कि यह आप को समझने में मदद करेंगे:

आपका कोड है जो संकलन नहीं करता है:

template<typename T> class derive2 : public base<T> 
{ 
    public: 
    derive2(int arg = theconstant) {} // this is line 18 
}; 

और कारण है कि:

template <> class base<size_t> 
{ 
    public: 
    static const int ha_idonthave_theconstant = 42; 
}; 
derive2<size_t> impossible_isnt_it; 

विशेषज्ञता !!! आपकी लाइन 18 पर कंपाइलर यह सुनिश्चित नहीं कर सकता है कि आप बेस <> आधार को विशेषज्ञ नहीं करेंगे जिस तरह से यह निरंतर उपस्थित नहीं होगा।

+0

यह इतना समझ में आता है कि मुझे आश्चर्य है कि यह मेरे साथ क्यों नहीं हुआ ... मैंने एक विशेष टेम्पलेट के साथ प्रयास किया, केवल एक ही सदस्य को एक अलग मूल्य के साथ शामिल किया, और मैं इसे काम नहीं कर सका। ओह अच्छा। धन्यवाद! –

2

template<typename T> class derive2 : public base<T> 
{ 
    public: 
    derive2(int arg = base<T>::theconstant) {} // this is line 18 
}; 

मूल रूप से आप "theconstant" के लिए अधूरा गुंजाइश निर्दिष्ट किया है की कोशिश करो।

+0

हाँ, टिप्पणियों में इसका उल्लेख किया गया था। लेकिन मैं समझना चाहता हूं कि यह 'व्युत्पन्न 2' में क्यों समझा जाता है, न कि 'व्युत्पन्न 1' में, भले ही विरासत संदिग्ध न हो। दायरा अधूरा किस तरह से है? –

+1

मुझे लगता है कि इसे "आलसी" टेम्पलेट त्वरण के साथ कुछ करना है। कंटेनर को ज्ञात _no_ 'बेस' वर्ग है जब वह derive2 में 'theconstant' को पार करती है। एक बार जब आप आधार का उपयोग करते हैं, तो आप बेस <> –

+0

के साथ "परिचित" होने के लिए कंपाइलर को मजबूर करते हैं, मुझे इसके बारे में सोचना होगा। –

संबंधित मुद्दे