2011-09-26 43 views
14

मैं कक्षा के लिए एक सी ++ प्रोग्राम पर काम कर रहा हूं, और मेरा कंपाइलर "अस्पष्ट" फ़ंक्शन कॉल के बारे में शिकायत कर रहा है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि विभिन्न मानकों के साथ परिभाषित कई कार्य हैं।मैं "अस्पष्ट" फ़ंक्शन कॉल कैसे ठीक करूं?

मैं संकलक को कैसे बता सकता हूं जिसे मैं चाहता हूं? केस-विशिष्ट फिक्स के अलावा, क्या कोई सामान्य नियम है, जैसे टाइपकास्टिंग, जो इस तरह की समस्याओं को हल कर सकता है?

संपादित करें:

मेरे मामले में, मैं एक cout बयान के अंदर abs() बुला दो double रों में गुजर की कोशिश की।

cout << "Amount is:" << abs(amountOrdered-amountPaid);

EDIT2:

मैं इन तीन हेडर हूँ:

#include <iostream> 
#include <fstream> 
#include <iomanip> 

using namespace std; 

Edit3:

मैं इस कोड के बिना कार्यक्रम पूरा कर लें, लेकिन इस questi के माध्यम से निम्नलिखित के हित में पर, मैंने समस्या का पुनरुत्पादन किया है। क्रियात्मक त्रुटि है:

'abs' पर कॉल संदिग्ध है।

कंपाइलर abs के तीन संस्करण प्रदान करता है, प्रत्येक पैरामीटर के रूप में एक अलग डेटाटाइप लेता है।

+1

क्या आप अपने कोड से एक उदाहरण दिखाएंगे? –

+1

यह वास्तव में स्थिति पर निर्भर करता है। आपको कोड पोस्ट करने की आवश्यकता है और यदि संकलक त्रुटि में कौन से फ़ंक्शंस उम्मीदवार हैं (हाल ही में जीसीसी करते हैं) जो मदद करता है। –

+2

यह भी अच्छा होगा कि कौन से हेडर शामिल हैं। – mkb

उत्तर

19

क्या हुआ है कि आप <cstdlib> शामिल किया है (है परोक्ष रूप से, क्योंकि इसमें iostream) using namespace std; के साथ शामिल है। यह हेडर में abs() नाम के साथ दो फ़ंक्शन घोषित करता है। कोई लेता है और long long देता है, और दूसरा long देता है। इसके अलावा, वहाँ वैश्विक नामस्थान (कि int रिटर्न) में एक है कि <stdlib.h> से आता है।

ठीक करने के लिए: ठीक है, abs() जो डबल लेता है <cmath> में है, और यह वास्तव में आपको वह उत्तर देगा जो आप चाहते हैं!

+4

टीएल; डीआर: नामस्थान का उपयोग करने से बचें। –

+0

@MatthieuM।, मैंने आईओएस एसडीके में 'std :: abs()' का उपयोग करते समय भी यह (sematic) त्रुटि देखी है। जब मैंने 'std ::' हटा दिया और केवल 'abs() 'का उपयोग किया तो त्रुटि हटा दी गई। – iammilind

+1

हाँ, समस्या स्वचालित संख्यात्मक प्रकार रूपांतरण के कारण अधिक है। – mkb

-1
नहीं

यकीन है कि क्यों यह पेट के पूर्णांक संस्करण बुला नहीं है, लेकिन आप प्रकार अभिव्यक्ति कास्टिंग की कोशिश कर सकते (amountOrdered - amountPaid) पूर्णांक यानी के रूप में

cout <<"Amount is: "<< abs((int)(amountOrdered - amountPaint)); 
+1

"यह सुनिश्चित नहीं है कि यह पेट के int संस्करण को क्यों नहीं बुला रहा है" क्या इसका कारण हो सकता है 'राशि' और 'राशि भुगतान' युगल हैं? –

+0

आप सही नहीं हैं कि मैं क्या सोच रहा था! @ ओपी कंपाइलर उलझन में है कि कौन सा संस्करण कॉल करने के लिए (लंबा या डबल) क्योंकि यह सुनिश्चित नहीं है कि इसे डबल या int से टाइप करने की आवश्यकता है या नहीं। श्रीमान। मार्टिन्हो - मुझे लगता है कि मेरा समाधान संकलक को यह तय करने में मदद करेगा कि कौन सा संस्करण कॉल करना है। तो मैं कुछ हद तक सही खड़ा हूं :) –

4

abs समारोह <cstdlib> रूप से शामिल int और long और long long के लिए ओवरलोड हो गया है। चूंकि आप तर्क के रूप में double देते हैं, तो कंपाइलर के पास सटीक फिट नहीं है, इसलिए को abs स्वीकार करने के लिए यह बदलने की कोशिश करता है, लेकिन यह नहीं जानता कि इसे int, long पर परिवर्तित करने का प्रयास करना चाहिए या नहीं, long long, इसलिए यह संदिग्ध है।

लेकिन शायद आप वास्तव में abs चाहते हैं जो double लेता है और double देता है। इसके लिए आपको <cmath> शामिल करना होगा।चूंकि double तर्क बिल्कुल मेल खाता है, इसलिए संकलक शिकायत नहीं करेगा।

ऐसा लगता है कि <cstdlib> स्वचालित रूप से शामिल हो जाता है जब आप अन्य शीर्षकों को शामिल नहीं करते हैं जो नहीं होना चाहिए। कंपाइलर को error: ‘abs’ was not declared in this scope या कुछ समान होना चाहिए था।

+0

'abs' एक फ़ंक्शन टेम्पलेट नहीं है। टेम्पलेट तर्क देना काम नहीं करेगा। एक 'static_cast (बार) 'संकलित करेगा (लेकिन अभी भी एक गलत जवाब दें) – mkb

+0

@mkb - धन्यवाद, मैं भूल गया कि वे टेम्पलेट फ़ंक्शंस विशेषज्ञताओं को बस ओवरलोड नहीं कर रहे हैं। उस भाग को संपादित किया। – JohnPS

2

<cmath> में परिभाषित करने का प्रयास करें। इसमें तर्क के रूप में float, double और long double लगते हैं। abs दोनों को <cmath> और <cstdlib> दोनों में परिभाषित किया गया है। अंतर abs(int), abs(long) और abs(long long)<cstdlib> में परिभाषित किया गया है जबकि अन्य संस्करण <cmath> में परिभाषित किए गए हैं।

+0

इस तरह की त्रुटि को ठीक करने के लिए एक सामान्य समाधान मानक सी लाइब्रेरी के बजाय लाइब्रेरी का C++ संस्करण का उपयोग करता है, ex: cddio stdio.h के बजाय। सी ++ libs का नाम उपसर्ग 'सी' के साथ है और नहीं '.h' – Andiana

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