यह this प्रश्न पर एक प्रकार का अनुवर्ती है।ओवरलोड रिज़ॉल्यूशन एक फ़ंक्शन को हल करता है जो अभी तक दिखाई नहीं दे रहा है
#include <iostream>
struct type1 {};
struct type2 {};
void foo(type1 x)
{
std::cout << "foo(type1)" << std::endl;
}
template<typename T>
void bar() {
foo(T());
}
int main()
{
bar<type1>();
bar<type2>();
return 0;
}
void foo(type2 x)
{
std::cout << "foo(type2)" << std::endl;
}
ऊपर कोड foo(type2)
में main
में bar<type2>
की इन्स्टेन्शियशन के समय में दिखाई नहीं देता है। और फिर भी कोड को संकलित करता है और निम्नलिखित उत्पादन का उत्पादन:
foo(type1)
foo(type2)
संकलक कैसे पता है कि foo(type2)
जब main
में bar<type2>
instantiating उपलब्ध है?
संपादित करें: मैं टेम्पलेट तत्काल कार्य के दौरान ओवरलोड रिज़ॉल्यूशन के बारे में और अधिक समझने की कोशिश कर रहा हूं।
#include <iostream>
struct type1 {};
struct type2 {};
struct type3 {
operator type2() { return type2(); }
};
void foo(type1 x)
{
std::cout << "foo(type1)" << std::endl;
}
void foo(type2 x)
{
std::cout << "foo(type2)" << std::endl;
}
int main()
{
foo(type3());
return 0;
}
void foo(type3 x)
{
std::cout << "foo(type3)" << std::endl;
}
उत्पादन
foo(type2)
हालांकि एक करीब मैच foo(type3)
उपलब्ध है, कॉल foo(type3())
foo(type2)
ले कर जाता है क्योंकि यह है कि केवल उम्मीदवार कि संकलक द्वारा पार्स किया गया है किया गया है: नीचे दिए गए कोड पर विचार करें उस बिंदु तक। अब निम्नलिखित कोड पर विचार करें:
#include <iostream>
struct type1 {};
struct type2 {};
struct type3 {
operator type2() { return type2(); }
};
void foo(type2 x)
{
std::cout << "foo(type2)" << std::endl;
}
template<typename T>
void bar() {
foo(T());
}
int main()
{
bar<type3>();
return 0;
}
void foo(type3 x)
{
std::cout << "foo(type3)" << std::endl;
}
उत्पादन
foo(type3)
कि कॉल bar<type3>()
के बिंदु पर है, है, भले ही केवल foo(type2)
दिखाई दे रहा है, संकलक अभी भी foo(type3)
कि बाद में आता है क्योंकि उठाता यह एक करीबी मैच है।
आपका कोड जीसीसी 4.6 के साथ ठीक से संकलित करता है। – keveman
@keveman: [यहां] से उद्धरण (http://gcc.gnu.org/gcc-4.7/changes.html): 'जी ++ अब दो चरण लुकअप नियमों को सही ढंग से लागू करता है जैसे टेम्पलेट में उपयोग किए गए अयोग्य नाम टेम्पलेट की परिभाषा के बिंदु पर या तत्कालता के बिंदु पर तर्क-निर्भर लुकअप द्वारा दायरे में एक उचित घोषणा है। जीसीसी 4.7 से लागू किया गया है। –
ठीक है। यह जीसीसी 4.7 के साथ विफल रहता है। धन्यवाद। हालांकि, मुझे क्या रोकता है यह तथ्य है कि, मेरे उदाहरण में, 'foo (type3) 'न तो' टेम्पलेट की परिभाषा के बिंदु पर 'और' तत्कालता के बिंदु पर 'उपलब्ध नहीं है। अभी भी वह है जिसे बुलाया जाता है। – keveman