मैं आज एक दिलचस्प मुद्दे पर भाग गया। इस सरल उदाहरण पर विचार करें:
template <typename T>
void foo(const T & a) { /* code */ }
// This would also fail
// void foo(const int & a) { /* code */ }
class Bar
{
public:
static const int kConst = 1;
void func()
{
foo(kConst); // This is the important line
}
};
int main()
{
Bar b;
b.func();
}
संकलन करते समय मुझे एक त्रुटि मिलती है:
Undefined reference to 'Bar::kConst'
अब, मुझे पूरा यकीन है कि ऐसा इसलिए है क्योंकि यह static const int
कहीं भी परिभाषित नहीं है, जो जानबूझकर किया गया है क्योंकि मेरी समझ के अनुसार संकलनकर्ता को संकलन-समय पर प्रतिस्थापन करने में सक्षम होना चाहिए और परिभाषा की आवश्यकता नहीं होनी चाहिए। हालाँकि, चूंकि फ़ंक्शन एक const int &
पैरामीटर लेता है , ऐसा लगता है कि यह प्रतिस्थापन नहीं बना रहा है, और इसके बजाय एक संदर्भ को प्राथमिकता दे रहा है। मैं निम्नलिखित परिवर्तन करके इस समस्या को हल कर सकता हूं:
foo(static_cast<int>(kConst));
मेरा मानना है कि यह अब संकलक को एक अस्थायी इंट बनाने के लिए मजबूर कर रहा है, और फिर उस संदर्भ को पास करें, जिसे वह सफलतापूर्वक संकलन समय पर कर सकता है।
मैं सोच रहा था कि क्या यह जानबूझकर किया गया था, या मैं इस मामले को संभालने में सक्षम होने के लिए जीसीसी से बहुत अधिक उम्मीद कर रहा हूं? या यह कुछ ऐसा है जो मुझे किसी कारण से नहीं करना चाहिए?
const int kConst = 1;
उसी परिणाम के साथ कर सकते हैं । इसके अलावा, वहाँ शायद ही कभी एक कारण है (मैं कोई नहीं सोच सकते हैं) एक समारोह प्रकार के एक पैरामीटर लेने के लिएconst int &
- बसint
यहाँ का उपयोग करें।