C++

2013-01-14 8 views
18

वेक्टर के उपयोग करते हुए मैं निम्नलिखित कोड में परेशानी आ रही है और यह पता लगाने की क्या गलतC++

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

double distance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    cout<<distance(age[0],age[1]); 
    return 0; 
} 

त्रुटि है नहीं कर पा रहे समारोह दूरी की फोन करने में निहित है।

/usr/include/c++/4.6/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits<int>’: 
test.cpp:18:30: instantiated from here 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:166:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:167:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:168:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:169:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:170:53: error: ‘int’ is not a class, struct, or union type 
+0

उपयोग कर सकते हैं आप क्या करना चाहते हैं? –

+0

मैं एक वेक्टर सरणी (गतिशील आकार के लिए) में डेटा स्टोर करना चाहता हूं, फिर डेटा बिंदुओं के बीच की दूरी की गणना करें। –

उत्तर

33

, "using namespace std" को दूर करने और std::

#include <iostream> 
#include <cmath> 
#include <vector> 


double distance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    std::vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    std::cout<< distance(age[0],age[1]); 
    return 0; 
} 

std::distance है साथ cout और endl योग्यता की कोशिश एक निर्दिष्ट सीमा के भीतर एक कंटेनर में तत्वों की संख्या गिनने के लिए प्रयोग किया जाता है। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं here

या यदि आप std:: नाम स्थान में पेश करना चाहते हैं तो आप अपने सुदूर क्रिया नाम बदल सकते हैं:

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

double mydistance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    cout<<mydistance(age[0],age[1]); 
    return 0; 
} 

यह आपके कोड काम कर देगा, लेकिन यह परिभाषाओं से पहले घोषणाओं "नाम स्थान का उपयोग कर" की है, अनुशंसित नहीं है। जब आप अपना कोड लिखते हैं, तो आपको दूसरे विकल्प से बचना चाहिए, यह केवल आपके कोड उदाहरण के विकल्प के रूप में दिखाया गया है।

+2

है या बस अपना खुद का दूरी फ़ंक्शन का नाम बदलें और 'std :: distance' के साथ संघर्ष को हटा दें। – Mithrandir

+1

@ मिथरंदिर यह एक त्वरित और सस्ता तय है। मैं पोस्टर जवाब पसंद करते हैं। – Caesar

+6

@ मिथुनंदिर, नहीं, "बस" "वैश्विक नेमस्पेस में एक और नामस्थान नहीं लाता है", क्योंकि यही कारण है कि हमारे पास * है! – Griwes

4
using namespace std

का उपयोग न करें जब आप अपने खुद के समारोह distance कहा जाता है, बना रहे हैं distance करने के लिए अपने कॉल std::distance और नहीं अपने distance समारोह की तलाश में है क्योंकि।

तुम भी ऐसा कर सकता है: आप std :: दूरी समारोह ओवरराइड करने के लिए कोशिश कर रहे हैं

namespace foo 
{ 
    double distance(int a, int b) 
    { 
    return fabs(a-b); 
    } 
} 

int main() 
{ 
    foo::distance(x,y); //now you're calling your own distance function. 
} 
+0

ऐसा लगता है कि उसके पास अपना 'दूरी' कार्यान्वयन – CAMOBAP

9

कैसे

के बारे में
cout<< ::distance(age[0],age[1]); 

(अन्य उत्तर पहले से ही using निर्देश को दूर करने का सुझाव देते हैं)।

+3

स्कोप रिज़ॉल्यूशन ऑपरेटर के बारे में जानना एक सार्थक बात है, लेकिन मैं इसे उत्पादन कोड में नहीं डालूंगा जब तक कि इससे बचने से बड़ी, बड़ी समस्याएं पैदा होंगी। उपयोगी ट्रिविया के लिए कम +1 नहीं। – dmckee

0

वैकल्पिक रूप से, आप

using foo::distance; // OR: 
using namespace foo; 

(distance)(x,y); // the (parens) prevent ADL