2015-03-03 2 views
5

Próbuję przekonwertować narzędzie z C na C++, więc mogę skompilować jako CLR. Jestem facetem .NET, więc jest to poza moją strefą komfortu.c do C++, utracone w tłumaczeniu

mam błąd kompilacji na następnej linii (powiedz mi, czy to nie jest wystarczająco dużo informacji):

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

currQ jest short. Błąd jest zdefiniowany w funkcji get_scale. Funkcja ta jest zdefiniowana wcześniej jako:

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

... która wygląda śmiesznie mi głąb typu odlewania piekła, ale nie kompilacji w C. Jednak w C++, pojawia się następujący komunikat o błędzie:

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

Rozumiem, że C nie stosuje koncepcji przeciążeń, ale C++ ma, a zmienna sygnatura na tym gorącym bałaganie sprawia, że ​​nie jest jasne, która funkcja wywołać.

Jak to naprawić? Jaki byłby właściwy sposób napisania tego w celu uzyskania maksymalnej zgodności z C++?

+3

Minor uwaga, 'get_scale' nie jest funkcją, to makro. – Borgleader

+1

Zestaw przeciążeń może być różny w zależności od tego, czy '#include ' lub '#include ' lub oba, bez względu na to czy używasz przestrzeni nazw standardowej '' (niezalecane), a także zależy od łańcucha narzędzi. To naprawdę jest dość brzydkie. Najłatwiej zrobić, aby typy były zgodne z funkcją C 'pow()', więc funkcja C jest zawsze wybrana. –

+1

Jeśli twoja moc 10, które musisz obliczyć, pasuje do liczby całkowitej (i wygląda na to, że to właśnie robisz), może być szybciej tylko użyć statycznej tablicy odnośników zamiast wywoływania 'pow'.I tak bym to zrobił, ponieważ istnieją pewne implementacje 'pow', które mają niewielkie błędy zaokrągleń, nawet jeśli używasz liczb całkowitych. – PaulMcKenzie

Odpowiedz

4

Nie ma przeładowanej wersji pow() w C++, która spełnia sygnaturę telefoniczną (int, int). Jedną z obsługiwanych konwencji wzywających jest (double, int) więc zmodyfikowanie połączenia do:

pow(10.0, ...) 

powinny być wystarczająco

+0

nie powinno być 'podwójnym pow (podstawa Type1, wykładnik Type2); 'pasuje do podpisu (int, int)? – thermite

+0

To kompiluje. Wspaniale, dziękuję. –

+0

@thermite: to rozszerzenie C++ 11. – haavee

0

w C++ funkcji pow ma następujący podpis

double pow (double base, double exponent); 

więc jeśli cię nazwać coś takiego

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

ale to za pomocą makra, a nie jestem zbyt wygodne te. Chciałbym utworzyć funkcję

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

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

+1

To jeden z podpisów. –

+1

[Ma wiele przeciążeń] (http://pl.cppreference.com/w/cpp/numeric/math/pow) w przeciwnym razie OP nie otrzyma "niejednoznacznego wywołania do przeciążenia funkcji". – Borgleader

+0

Mój zły, kiedy poszedłem do cplusplus.com to było domyślnie w dokumentacji c90, która miała tylko jeden podpis, ale masz rację. jednak zmiana tylko na dwójki będzie działała. – thermite

0

Według

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

istnieje wiele pow() warianty. Dzwonisz pod numer pow() z odlewaniem typów, ale kompilator ma kilka funkcji pasujących do siebie i myli się.

Zmień definicję get_scale(), aby uzyskać bardziej szczegółowy opis typów, aby kompilator mógł wybrać jednoznaczną wersję pow().