2009-08-17 5 views
9

Так у меня есть этот код:Как объявить функцию ехЬегпа «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)); 
} 

И получить эту ошибку:

 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 

Так эта ошибка, потому что «журнал» является ехЬегпом «C "'d in math.h

Мне было интересно, как объявить аргумент указателя функции в foo(), поэтому он обрабатывает внешние функции« C ».

+1

не то, что он отвечает на ваш вопрос, но в этой конкретной ситуации не требуется 'boost :: bind',' std :: bind2nd' будет делать работу просто отлично. –

ответ

18

Вы можете попробовать в том числе cmath вместо этого, и с помощью static_cast<double(*)(double)>(std::log) (литой необходимо решить к перегрузке double).

В противном случае вы ограничите свою функцию функциями extern C. Это будет работать как

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

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

Другой способ это сделать foo функтор

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

Затем вы можете передать foo() к boost::bind, и потому что это шаблонный, он будет принимать какой-либо связи. Он также будет работать с объектами функций, а не только с указателями функций.

+0

Удивительно, я попробовал с функтором, но я не думал об исправлении его для всех типов с помощью шаблона. благодаря – Salgar

4

Попробуйте использовать ЬурейеЕ:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^