3

我正在尝试使用 boost::python 公开重载函数。函数原型是:

#define FMS_lvl2_DLL_API __declspec(dllexport)
void FMS_lvl2_DLL_API write(const char *key, const char* data);
void FMS_lvl2_DLL_API write(string& key, const char* data);
void FMS_lvl2_DLL_API write(int key, const char *data);

我已经看到了这个答案:如何指定指向重载函数的指针?
这样做:

BOOST_PYTHON_MODULE(python_bridge)
{
    class_<FMS_logic::logical_file, boost::noncopyable>("logical_file")
        .def("write", static_cast<void (*)(const char *, const char *)>( &FMS_logic::logical_file::write))
    ;
}

结果出现以下错误:

error C2440: 'static_cast' : cannot convert from 'overloaded-function' to 'void (__cdecl *)(const char *,const char *)'
      None of the functions with this name in scope match the target type

尝试以下方法:

void (*f)(const char *, const char *) = &FMS_logic::logical_file::write;

结果:

error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'void (__cdecl *)(const char *,const char *)'
          None of the functions with this name in scope match the target type

出了什么问题以及如何解决?

编辑 我忘了提几件事:

  • 我在win-7上使用vs2010 pro
  • write 是logical_file 的成员函数
  • FMS_logic 是一个命名空间
4

2 回答 2

2

如果 write 是一个纯函数,那么第二次尝试应该可以工作。从您的代码看来,您确实有一个成员函数。指向成员函数的指针很难看,您宁愿使用函数对象。但是:您必须发布整个代码,尚不清楚 write 是否是成员函数。

编辑:如果它是 FMS_logic::logical_file 的成员函数,则语法为:

void (FMS_logic::logical_file::*f)(const char *, const char *) = &FMS_logic::logical_file::write;

这仅适用于非静态成员函数,即如果函数是静态的或logical_file 只是一个名称空间,那么它与您之前编写的一样。

于 2013-07-25T08:29:46.327 回答
0

您的代码不起作用,因为您的函数指针类型错误。您需要包括所有类型限定符(缺少您的 DLL 限定符),并且正如 Klemens 所说,类名。把这些放在一起,你的代码应该是

.def("write", static_cast<void FMS_lvl2_DLL_API
                            (FMS_logic::logical_file::*)(const char *, const char *)>
                         (&FMS_logic::logical_file::write))

感谢 static_cast<> 的提示,我遇到了和你一样的问题,只是没有 dllexport,并且在添加 static_cast 后它可以工作:-)

于 2017-10-18T11:29:30.933 回答