2012-11-10 26 views
5

ठीक इतने heres कार्यक्रम और बिल्कुल सहीयदि मैं अपना फ़ंक्शन 'स्वैप' नाम देता हूं तो मुझे टेम्पलेट त्रुटि क्यों मिलती है, लेकिन 'स्वैप' ठीक है?

#include <iostream> 

using namespace std; 

template <typename T> 
void Swap(T &a , T &b); 

int main(){ 

    int i = 10; 
    int j = 20; 

    cout<<"i, j = " << i <<" , " <<j<<endl; 
    Swap(i,j); 
    cout<<"i, j = " << i <<" , " <<j<<endl; 


} 
template <typename T> 
void Swap(T &a , T &b){ 
    T temp; 
    temp = a ; 
    a = b; 
    b= temp; 
} 

काम करता है लेकिन जब मैं स्वैपस्वैप करने के लिए से समारोह का नाम बदलने यह

error: call of overloaded 'swap(int&, int&)' is ambiguous| note: candidates are: void swap(T&, T&) [with T = int]| ||=== Build finished: 1 errors, 0 warnings ===|

कह एक त्रुटि उत्पन्न करता है क्या हुआ यह एक पूंजी पत्र से शुरू करने के लिए टेम्पलेट का उपयोग कर कार्यों को शुरू करने का एक नियम है?

+0

कौन/कहां सुझाव दिया गया है कि टेम्पलेट किए गए फ़ंक्शन नामों को पूंजी पत्र से शुरू करना चाहिए? मैं पूछ रहा हूं क्योंकि मुझे नहीं पता, क्योंकि मैं असहमत नहीं हूं। हालांकि, उदाहरण के लिए मानक पुस्तकालय low_case नामकरण सम्मेलन का भी उपयोग करता है, इसलिए एक त्वरित विचार पर मैं ऐसी नामकरण योजना के लिए एक महान लाभ के साथ नहीं आ सकता। :) – zxcdw

उत्तर

10

ऐसा इसलिए है क्योंकि swap नामक एक फ़ंक्शन मौजूद है। यह वास्तव में std नामस्थान के अंतर्गत है, लेकिन क्योंकि आपके पास using namespace std लाइन है, यह std:: उपसर्ग के बिना मौजूद है।

जैसा कि आप देख सकते हैं, using namespace std का उपयोग करना संभव नाम टकराव के कारण हमेशा एक अच्छा विकल्प नहीं है, जैसा कि इस उदाहरण में है। आम तौर पर using निर्देश का उपयोग न करना चाहिए, जब तक कि इसका कोई वास्तविक कारण न हो - नाम के टकराव को रोकने के लिए नामस्थान मौजूद हैं।

+0

ओह! मेरे बारे में इतना बेवकूफ धन्यवाद –

+0

मैं बस लॉल किया ... –

संबंधित मुद्दे