13

だから私はこのコードを持っています:

#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

したがって、このエラーは、'log' が math.h で extern "C"'d であるためです。

foo() で関数ポインタ引数を宣言する方法を考えていたので、extern "C"'d 関数を処理します。

4

2 に答える 2

23

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これはテンプレート化されているため、あらゆるリンケージを受け入れます。関数ポインタだけでなく、関数オブジェクトでも機能します。

于 2009-08-17T17:11:51.377 に答える
4

typedef を使用してみてください。

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

double foo(double num, CDoubleFunc func) {
  return 65.4;
}
于 2009-08-17T17:09:22.800 に答える