“错误:无效使用非静态数据成员'thread :: tfun'”
Class thread {
typedef void* (th_fun) (void*);
th_fun *tfun;
void create(th_fun *fun=tfun) {
pthread_create(&t, NULL, fun, NULL);
}
}
如何在类中包含函数指针?
请注意: - 静态减速将使代码编译。但我的要求是保持每个对象的功能。
答案 0 :(得分:3)
你对pthreads的使用很好,你在这里没有指向成员函数的指针。
问题在于您尝试使用非静态成员变量作为函数的默认参数,you can't do that:
struct T {
int x;
void f(int y = x) {}
};
// Line 2: error: invalid use of non-static data member 'T::x'
// compilation terminated due to -Wfatal-errors.
默认参数必须是“基本上 - 全局”,或者至少是一个不需要限定的名称。
幸运的是,它很容易解决!
Class thread {
typedef void* (th_fun) (void*);
th_fun* tfun;
void create(th_fun* fun = NULL) { // perfectly valid default parameter
if (fun == NULL) {
fun = tfun; // works now because there's an object
} // context whilst we're inside `create`
pthread_create(&t, NULL, fun, NULL);
}
};
答案 1 :(得分:0)
使用非静态成员函数t
无法执行此操作。
您可以做的是通过class thread
参数将t
的指针传递给void *
。或者,如果您还有t
的其他参数,则可以将它们全部包含在结构中(包括指向class thread
的点)并传递结构实例的指针。
正如其他人所说,只有extern "C"
函数符合pthread_create
的需要。