结构成员字段是函数指针时获取错误

时间:2016-12-28 15:30:15

标签: c++ pointers

我需要将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;
}

3 个答案:

答案 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)

这里有几个错误。

  1. typedef void (*pfpv)(void *obj); ...您遗漏了第一个*,因此pfpv只是一个函数类型,而不是函数指针类型。

  2. (t.func)();您使用了指针到成员函数的调用语法,但您的t.func只是一个普通的函数指针,因此请使用.而不是{ {1}}。

  3. 此外,您没有将任何参数传递给期望.*的函数。我们暂时可以通过void*

  4. Here it is compiling, with those fixes in place

    如果您使用更简单的nullptr,则可以避免这种彻底的崩溃:

    std::function

    Live demo

    不需要那个过时的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);

Live Demo