2009-08-17 22 views
9

Così ho questo codice:Come fanno dichiarare un puntatore a funzione extern "C"

#include "boost_bind.h" 
#include <math.h> 
#include <vector> 
#include <algorithm> 

double foo(double num, double (*func)(double)) { 
    return 65.4; 
} 

int main(int argc, char** argv) { 
    std::vector<double> vec; 
    vec.push_back(5.0); 
    vec.push_back(6.0); 
    std::transform(vec.begin(), vec.end(), vec.begin(), boost::bind(foo, _1, log)); 
} 

E ricevere questo errore:

 return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); 
.............................................................^ 
%CXX-E-INCOMPATIBLEPRM, argument of type "double (* __ptr64)(double) C" is 
      incompatible with parameter of type "double (* __ptr64)(double)" 
      detected during: 
      instantiation of ...5 pages of boost 

Quindi questo errore è perché 'log' è extern "C " 'd in math.h

mi chiedevo come dichiarare la mia funzione argomento puntatore nella foo() in modo che gestisce extern "C"' d funzioni.

+1

non che risponda alla tua domanda, ma questa particolare situazione non richiede 'boost :: bind',' std :: bind2nd' farebbe bene il lavoro. –

risposta

18

si può provare tra cui cmath invece, e utilizzando static_cast<double(*)(double)>(std::log) (fusione necessaria per risolvere al double sovraccarico).

In caso contrario, si limiterà la funzione alle funzioni extern C. Ciò funziona come

extern "C" typedef double (*ExtCFuncPtr)(double); 

double foo(double num, ExtCFuncPtr func) { 
    return 65.4; 
} 

Un altro modo è quello di fare foo un funtore

struct foo { 
    typedef double result_type; 
    template<typename FuncPtr> 
    double operator()(double num, FuncPtr f) const { 
    return 65.4; 
    } 
}; 

Poi si può passare foo()-boost::bind, e perché è basato su modelli, la volontà di accettare qualsiasi collegamento. Funzionerà anche con gli oggetti funzione, non solo con i puntatori di funzione.

+0

Incredibile, ho provato con un functor ma non ho pensato di risolverlo per tutti i tipi con un modello. Grazie – Salgar

4

Provare a utilizzare un typedef:

extern "C" { 
    typedef double (*CDoubleFunc)(double); 
} 

double foo(double num, CDoubleFunc func) { 
    return 65.4; 
} 
Problemi correlati