नीचे कोड का संदर्भ लें:निर्देश सी में घोषणा की अदला-बदली का उपयोग कर बनाम का उपयोग कर ++
#include <algorithm>
namespace N
{
template <typename T>
class C
{
public:
void SwapWith(C & c)
{
using namespace std; // (1)
//using std::swap; // (2)
swap(a, c.a);
}
private:
int a;
};
template <typename T>
void swap(C<T> & c1, C<T> & c2)
{
c1.SwapWith(c2);
}
}
namespace std
{
template<typename T> void swap(N::C<T> & c1, N::C<T> & c2)
{
c1.SwapWith(c2);
}
}
जैसा कि ऊपर लिखा है, कोड दृश्य स्टूडियो 2008/2010 पर संकलन नहीं है। त्रुटि है:
'void N::swap(N::C<T> &,N::C<T> &)' : could not deduce template argument for 'N::C<T> &' from 'int'.
हालांकि, अगर मैं (1) और असम्बद्धता (2) टिप्पणी करता हूं, तो यह ठीक संकलित होगा। using namespace std
और using std::swap
के बीच क्या अंतर है जो इस व्यवहार को बताता है?
यह एक दायरा मुद्दा प्रतीत होता है। नियम है (यदि मैं गलत नहीं हूं) तो यह हमेशा सबसे स्थानीय दायरे का उपयोग करेगा। तो यह 'std :: swap' के बजाय' N :: swap' का उपयोग करेगा, भले ही आपके पास 'नामस्थान std' – andre
बीटीडब्लू का उपयोग कर रहा हो, कोड खराब हो गया है, और कार्यक्रम में अपरिभाषित व्यवहार है। आप 'std' नेमस्पेस, केवल विशेषज्ञता के लिए फ़ंक्शन टेम्पलेट * अधिभार * नहीं जोड़ सकते हैं। –
इसके अलावा, यह स्वैप कैसे काम करता है, जहां तक मैं कह सकता हूं कि यह एक अनंत लूप है। – andre