2015-03-03 10 views
5

मैं सी से सी ++ में एक टूल को कन्वर्ट करने का प्रयास कर रहा हूं, इसलिए मैं सीएलआर के रूप में संकलित कर सकता हूं। मैं एक .NET लड़का हूं इसलिए यह मेरे आराम क्षेत्र से बाहर है।सी से सी ++, अनुवाद में खो गया

मैं निम्न पंक्ति (मुझे बताओ अगर यह पर्याप्त जानकारी नहीं है) पर एक संकलन त्रुटि है:

if (qvartype[ currQ ] == FLOATING) 
    *range *= get_scale(currQ);    /* Make range units match */ 
               /* data units.    */ 

currQ एक short है। त्रुटि get_scale फ़ंक्शन पर परिभाषित की गई है। इस समारोह परिभाषित किया गया है पहले के रूप में:

#define get_scale(i) ((short)pow(10, (int)((long)(cat_names[ i ])))) 

... जो मेरे लिए हास्यास्पद लग रहा है, में गहरी प्रकार कास्टिंग नरक, लेकिन यह सी में संकलित करता है हालांकि, सी ++ में, मैं निम्न त्रुटि संदेश मिलता है:

Error 374 error C2668: 'pow' : ambiguous call to overloaded function 

मुझे समझ में आता है कि सी ओवरलोड की अवधारणा को नियोजित नहीं करता है, लेकिन सी ++ करता है, और इस गर्म गड़बड़ी पर परिवर्तनीय हस्ताक्षर यह स्पष्ट नहीं करता है कि कौन सा काम करने के लिए कार्य करता है।

मैं इसे कैसे ठीक करूं? C++ के साथ अधिकतम संगतता के लिए इसे लिखने का सही तरीका क्या होगा? अगर आप की तरह

#define get_scale(i) ((short)pow(10.0, (double)cat_names[ i ]))) 

लेकिन यह है कि एक मैक्रो उपयोग कर रहा है कुछ फोन किए गए

+3

माइनर ध्यान दें, 'get_scale' एक समारोह है, यह एक मैक्रो है नहीं होना चाहिए: समर्थित बुला सम्मेलनों में से एक (double, int) इतना करने के लिए अपने कॉल को संशोधित करने के लिए है। – Borgleader

+1

ओवरलोड का सेट अलग-अलग हो सकता है कि आप 'या' # शामिल करें 'या दोनों, चाहे आप नेमस्पेस std का उपयोग कर रहे हों;' (अनुशंसित नहीं) और टूलचेन पर भी निर्भर करता है। यह वास्तव में बहुत बदसूरत है। करने के लिए सबसे आसान बात यह है कि प्रकार सी 'पाउ()' फ़ंक्शन से मेल खाते हैं, इसलिए सी फ़ंक्शन हमेशा चुना जाता है। –

+1

यदि आपकी 10 शक्तियां हैं जिन्हें आपको एक पूर्णांक में फिट करने की आवश्यकता है (और ऐसा लगता है कि आप यही कर रहे हैं), तो यह 'पाउ' को कॉल करने के बजाय स्थिर लुकअप टेबल का उपयोग करने के लिए तेज़ हो सकता है।मैं वैसे भी ऐसा करूंगा, क्योंकि 'पाउ' के कुछ कार्यान्वयन हैं जिनमें मामूली गोल त्रुटियां हैं, भले ही आप पूर्णांक का उपयोग कर रहे हों। – PaulMcKenzie

उत्तर

4

सी ++ में पाउ() का कोई अधिभारित संस्करण नहीं है जो (int, int) के आपके कॉलिंग हस्ताक्षर को संतुष्ट करता है।

pow(10.0, ...) 

पर्याप्त

+0

को डबल डबल नहीं होना चाहिए (टाइप 1 बेस, टाइप 2 एक्सपोनेंट); 'int (int, int) हस्ताक्षर में फिट? – thermite

+0

यह संकलित करता है। बहुत बड़िया धन्यवाद। –

+0

@thermite: यह एक सी ++ 11 एक्सटेंशन है। – haavee

0
C++ पॉव समारोह

double pow (double base, double exponent); 

तो निम्न हस्ताक्षर है, और मैं के साथ भी आराम से नहीं कर रहा हूँ उन। मैं एक समारोह बन जाएगा

short get_scale(int i){return (short)pow(10.0, (double)cat_names[ i ])}; 

http://www.cplusplus.com/reference/cmath/pow/

+1

यह हस्ताक्षरों में से एक है। –

+1

[इसमें कई अधिभार हैं] (http://en.cppreference.com/w/cpp/numeric/math/pow) अन्यथा ओपी को ओवरलोडेड फ़ंक्शन 'त्रुटि के लिए' अस्पष्ट कॉल नहीं मिल रहा है। – Borgleader

+0

मेरा बुरा जब मैं cplusplus.com पर गया तो यह डिफ़ॉल्ट रूप से c90 दस्तावेज में था, जिसमें केवल 1 हस्ताक्षर था लेकिन आप सही हैं। हालांकि युगल होने के लिए बदलना केवल काम करेगा। – thermite

0

देख

https://msdn.microsoft.com/en-us/library/dt5dakze.aspx

के अनुसार वहाँ कई pow() वेरिएंट हैं। आप टाइपिंग के साथ pow() पर कॉल कर रहे हैं, लेकिन कंपाइलर के पास कुछ फ़ंक्शन मिलते हैं और भ्रमित हो जाते हैं।

get_scale() की परिभाषा को प्रकार के बारे में अधिक विशिष्ट होने के लिए बदलें, इसलिए संकलक उचित pow() संस्करण को अनजाने में चुन सकता है।

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