我需要将struct成员作为常规函数指针(不是类成员函数指针)。不确定编译错误的原因。我在Ubuntu 14.04上运行g ++ 4.8.4。感谢。
$ g++ te5.cc
te5.cc: In function ‘int main(int, char**)’:
te5.cc:18:9: error: invalid use of member function (did you forget the ‘()’ ?)
t.func = dum;
^
te5.cc:19:6: error: ‘func’ was not declared in this scope
(t.*func)();
代码段
#include <stdio.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void pfpv(void *obj);
typedef struct {
pfpv func;
void *obj;
} strTimer;
void dum(void* p) {
printf("in dum()\n");
}
int main (int argc, char *argv[]) {
strTimer t;
t.func = dum;
(t.*func)();
return 0;
}
答案 0 :(得分:4)
这可以通过使pfpv
成为函数指针而不是函数来解决。
#include <stdio.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef void (*pfpv)(void *obj);
typedef struct {
pfpv func;
void *obj;
} strTimer;
void dum(void* p) {
printf("in dum()\n");
}
int main (int argc, char *argv[]) {
strTimer t;
t.func = dum;
t.func(0);
return 0;
}
答案 1 :(得分:2)
这里有几个错误。
typedef void (*pfpv)(void *obj);
...您遗漏了第一个*
,因此pfpv
只是一个函数类型,而不是函数指针类型。
(t.func)();
您使用了指针到成员函数的调用语法,但您的t.func
只是一个普通的函数指针,因此请使用.
而不是{ {1}}。
此外,您没有将任何参数传递给期望.*
的函数。我们暂时可以通过void*
。
Here it is compiling, with those fixes in place
如果您使用更简单的nullptr
,则可以避免这种彻底的崩溃:
std::function
不需要那个过时的C cruft!
据推测,传递#include <iostream>
#include <functional>
struct strTimer
{
std::function<void(void*)> func;
void* obj;
};
void dum(void* p)
{
std::cout << "in dum()\n";
}
int main()
{
strTimer t;
t.func = &dum;
(t.func)(nullptr);
}
作为参数也可以通过传入void*
(而不是&t
)来模拟成员函数来满足某些原始C语言。您应该考虑使用lambda函数和其他现代语言功能;您的程序将更容易编写,维护和调试。
答案 2 :(得分:1)
问题是你的函数指针typedef(它没有指定函数指针)。像这样改变:
typedef void (*pfpv)(void *obj);
函数指针的调用也是错误的:
(t.func)(&t);