2015-03-03 28 views
5

Sto tentando di convertire uno strumento da C a C++ così posso compilare come CLR. Sono un ragazzo di .NET quindi questo è fuori dalla mia zona di comfort.da c a C++, perso nella traduzione

Ho un errore di compilazione nella riga seguente (ditemi se questo non è abbastanza informazioni):

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

currQ è un short. L'errore è definito sulla funzione get_scale. Questa funzione è definita in precedenza come:

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

... che sembra ridicolo a me, in profondità nel tipo di fusione inferno, ma non compila in C. Tuttavia, in C++, ottengo il seguente messaggio di errore:

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

Capisco che C non impieghi il concetto di overload, ma C++ lo fa e la firma variabile su questo hot mess rende poco chiaro quale funzione invocare.

Come posso risolvere questo problema? Quale sarebbe il modo giusto per scrivere questo per la massima compatibilità con C++?

+3

nota minore, 'get_scale' non è una funzione, è una macro. – Borgleader

+1

L'insieme di sovraccarichi può anche essere diverso a seconda che tu sia "#include " o "#include " o entrambi, sia che tu stia usando namespace std; '(non raccomandato) e dipende anche dalla toolchain. È davvero brutto. La cosa più semplice da fare è far sì che i tipi corrispondano alla funzione C 'pow()', quindi la funzione C viene sempre scelta. –

+1

Se i tuoi poteri di 10 che devi calcolare rientrano in un numero intero (e sembra che sia quello che stai facendo), potrebbe essere più veloce usare semplicemente una tabella di ricerca statica invece di chiamare 'pow'.Lo farei comunque, in quanto vi sono alcune implementazioni di 'pow' che hanno lievi errori di arrotondamento, anche se stai usando numeri interi. – PaulMcKenzie

risposta

4

Non esiste una versione sovraccaricata di pow() in C++ che soddisfi la vostra firma chiamante di (int, int). Una delle convenzioni di chiamata supportati è (double, int) così modificando la chiamata a:

pow(10.0, ...) 

dovrebbe essere abbastanza

+0

non dovrebbe 'double pow (base Type1, esponente Type2); 'adatto alla firma (int, int)? – thermite

+0

Questo compila. Eccellente grazie. –

+0

@thermite: questa è un'estensione C++ 11. – haavee

0

in C++ la funzione pow ha la seguente firma

double pow (double base, double exponent); 

quindi se hai fatto si chiama qualcosa come

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

ma che sta utilizzando una macro, e io non sono troppo comodo con quelli. avrei creare una funzione

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

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

+1

Questa è una delle firme. –

+1

[Ha molti sovraccarichi] (http://en.cppreference.com/w/cpp/numeric/math/pow) altrimenti OP non riceverebbe un errore 'chiamata ambigua a funzione sovraccaricata'. – Borgleader

+0

Il mio male quando sono andato a cplusplus.com era nella documentazione c90 per impostazione predefinita, che aveva solo 1 firma ma hai ragione. tuttavia cambiare solo per il doppio funzionerebbe. – thermite

0

Secondo

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

ci sono molti pow() varianti. Stai chiamando pow() con il cast di tipo, ma il compilatore ha poche funzioni corrispondenti e si confonde.

Modificare la definizione di get_scale() per essere più specifici sui tipi, in modo che il compilatore possa selezionare la versione corretta di pow() in modo univoco.