2009-08-17 7 views
9

So habe ich diesen Code:Wie eine extern "C" Funktionszeiger deklarieren

#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)); 
} 

Und diesen Fehler erhalten:

 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 

So ist dieser Fehler, weil 'log' extern „C "d in math.h

Ich fragte mich, wie ich meine Funktion Pointer-Argument in foo() deklarieren, so dass es externe" C "'d Funktionen behandelt.

+1

nicht, dass es Ihre Frage beantwortet, aber diese besondere Situation erfordert nicht "boost :: bind", "std :: bind2nd" würde die Arbeit gut machen. –

Antwort

18

Sie versuchen cmath einschließlich können stattdessen und static_cast<double(*)(double)>(std::log) (Guss notwendig, um die double Überlastung zu lösen).

Andernfalls begrenzen Sie Ihre Funktion auf extern C Funktionen. Dies würde funktionieren wie

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

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

Ein anderer Weg ist foo Funktor

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

Dann können Sie foo()-boost::bind passieren zu machen, und weil es auf Vorlagen ist, wird es jede Verknüpfung akzeptieren. Es funktioniert auch mit Funktionsobjekten, nicht nur mit Funktionszeigern.

+0

Erstaunlich, ich versuchte es mit einem Funktor, aber ich dachte nicht daran, es für alle Arten mit einer Vorlage zu reparieren. Vielen Dank – Salgar

4

Versuchen Sie, eine typedef:

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

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