我成功地最终能够在previous post here的C ++项目中使用PDcurses库中的TUI头。
现在在我班上我包括C头:
#include "tui.h"
tui在C中并具有菜单的定义:
typedef struct
{
char *name; /* item label */
FUNC func; /* (pointer to) function */
char *desc; /* function description */
} menu;
所以在MainView.cpp中我有:
void sub0()
{
//domenu(SubMenu0);
}
void sub1()
{
//domenu(SubMenu1);
}
void MainView::showMainMenu()
{
menu MainMenu[] =
{
{ "Users", sub0, "Manage Users" },
{ "Accounts", sub1, "Manage Accounts" },
{ "Items", sub1, "Manage Items" },
{ "Staff", sub1, "Manage Staff" },
{ "", (FUNC)0, "" }
};
startmenu(MainMenu, "Library System 1.0");
}
这是按预期工作的。
问题是我需要在sub0()和sub1()中调用我的类方法。
我试图为我的类定义C ++方法来尝试替换sub0和sub1 用:
void MainView::sub0()
{
//domenu(SubMenu0);
}
void MainView::sub1()
{
//domenu(SubMenu1);
}
编译器抛出此错误:
error C2440: 'initializing' : cannot convert from 'overloaded-function' to 'FUNC'
None of the functions with this name in scope match the target type
将这些函数指针传递给C代码并摆脱该错误的最佳方法是什么?
感谢
答案 0 :(得分:5)
C ++类对象有一个“this”指针,它作为类成员函数的第一个参数被无形地传递。这意味着您不能将非静态成员函数用于带有0个参数的C样式函数指针。
所以解决这个问题,你有几个选择。在告诉你哪一个之前我需要更多细节。
使用boost或tr1或其他一些允许使用this指针绑定成员函数的C ++库。使用boost,这看起来像:
{ "Users", boost::bind(&MainView::sub0, this), "Manage Users" },
您可以修改代码以传递对类对象的引用以及这些函数指针。如果是这样,您可以直接在所需对象上调用回调。看起来您正在与窗口管理器打交道,因此您可能无法进行此方法所需的更改。
答案 1 :(得分:2)
我认为不可能将非静态成员函数作为FUNC指针传递。因为编译器会将 this 指针传递给所有非静态成员函数。
您有两个选择: