2013-07-25 2 views
3

Я пытаюсь выставить перегруженную функцию с помощью boost :: python. функциональные прототипы:C++ указатели на перегруженные функции

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

I'v видел этот ответ: 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 

, что не так и как это исправить?

EDIT Я забыл упомянуть несколько вещей:

  • Я использую VS2010 про на Win-7
  • записи является функцией членом logical_file
  • FMS_logic это пространство имен

ответ

2

Ну, второй attemp должен работать, если запись является чистой функцией. Из вашего кода кажется, что у вас есть функция-член. Указатели на функции-члены уродливы, вы предпочтете использовать объект функции. Однако: вам нужно будет опубликовать весь код, неясно, является ли запись функцией-членом или нет.

Edit: если он является членом-функцией FMS_logic :: logical_file синтаксис будет:

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

Это как раз относится к не-статической функции-члена, т.е. если функция является статическим или logical_file просто пространство имён, как вы его писали раньше.

+0

спасибо. доза имеет значение, если FMS_logic является пространством имен? – elyashiv

+0

К сожалению, Boost.Python официально не поддерживает функциональные объекты. Хотя функциональные объекты могут работать в большинстве областей, самым безопасным поведением является запись не-членной функции, которая принимает экземпляр и аргументы, а затем вызывает функцию-член. –

0

Ваш код не работает, потому что ваш тип указателя функции неверен. Вам нужно включить все отборочные типа (ваш DLL отборочный отсутствуют), и, как сказал Клеменс, имя класса, то есть, код должен прочитать

.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 это работает :-)

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