पर विचार करें निम्नलिखित कोड:सी ++ अधिभार संकल्प नियमों में एक दोष?
#include <iostream>
namespace ns1
{
struct A
{
};
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns1::print" << std::endl;
}
}
namespace ns2
{
template <class T>
std::ostream& operator << (std::ostream& os, const T& t)
{
return os << "ns2::print" << std::endl;
}
void f (const ns1::A& a)
{
std::cout << a;
}
}
int main()
{
ns1::A a;
ns2::f (a);
return 0;
}
संकलन प्रति मानक के रूप में "अस्पष्ट अधिभार त्रुटि" के साथ विफल रहता है।
लेकिन क्यों? निश्चित रूप से ए के 'घर' नामस्थान में "समान रूप से अच्छा" ऑपरेटर प्राथमिकता लेना चाहिए? क्या ऐसा कोई तार्किक कारण नहीं है?
तुम्हें क्या लगता है 'A' के" होम "नाम स्थान में कार्य बुला समारोह' खुद f' का नाम स्थान में कार्यों से प्राथमिकता दी जाती चाहिए? इस संदिग्ध होने के आसपास कोई रास्ता नहीं है। एक त्रुटि केवल समझदार चीज है। –
क्योंकि जो भी नामस्थान से बनाया गया है, जानता है कि ए को मुद्रित किया जाना चाहिए? – cppalex
सबसे पहले, वे टेम्पलेट्स हैं। यदि वह व्यक्ति जिसने 'ए' बनाया है, वह 'ए' प्रकार की वस्तुओं को मुद्रित करने के लिए एक निश्चित व्यवहार सुनिश्चित करना चाहता था, तो वे या तो अधिभार या विशेषज्ञता प्रदान करते थे। इससे यहां अस्पष्टता का समाधान हो गया होगा। दूसरा, नेमस्पेस को कई बार खोला जा सकता है और बंद कर दिया जा सकता है, इसलिए फ़ंक्शन को 'ए' के कार्यान्वयनकर्ता द्वारा भी प्रदान नहीं किया जा सकता है। –