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>
के किसी ऑब्जेक्ट को तुरंत चालू करते समय।
मुझे यह भी पता है कि इस संकलन को बदलने के लिए क्या बदलना है, इसलिए मैं वास्तव में कोड के एक-पंक्ति के टुकड़े उत्तर के रूप में नहीं देख रहा हूं। मैं समझना चाहता हूं क्यों ऐसा होता है! मैंने वेब पर खोज करने की कोशिश की, लेकिन स्पष्ट रूप से मैं सही खोज तर्कों का उपयोग नहीं कर रहा हूं।
एफडब्ल्यूआईडब्ल्यू, यह वही कोड वीसी ++ 2010 में ठीक है। यह जीसीसी में एक बग हो सकता है ... – dsharlet
'derive2 (int arg = base :: theconstant) {} 'ठीक संकलित करता है। –
jrok
@ डीशर्लेट - जीसीसी के हिस्से पर एक बग नहीं, जैसा कि स्पेक में वर्णित है। – Flexo