【问题标题】:c++ pointers to overloaded functionsc++ 指向重载函数的指针
【发布时间】:2013-07-25 08:23:34
【问题描述】:

我正在尝试使用 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);

我看过这个答案:How do I specify a pointer to an overloaded function?
这样做:

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 是一个命名空间

【问题讨论】:

    标签: c++ function-pointers boost-python


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 遗憾的是,Boost.Python 并没有正式支持函数对象。尽管函数对象可以在大多数领域工作,但最安全的行为是编写一个非成员函数,它接受实例和参数,然后调用成员函数。
    【解决方案2】:

    您的代码不起作用,因为您的函数指针类型错误。您需要包括所有类型限定符(缺少您的 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 后它就可以工作了 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多