0

我已经根据一些搜索应用了解决方案,但问题仍然存在。十分感谢你的帮助。

error: must use '.*' or '->*' to call pointer-to-member function ...

源代码:

#include <stdio.h>

class A
{
  public:

    struct data;
    typedef int (A::*func_t)(data *);
    typedef struct data
    {
      int i;
      func_t func;
    }
    data;

    data d;

    void process()
    {
        d.func(&d);
    }

    A()
    {
        d.i = 999;
        d.func = &A::print;
    }

    int print(data *d)
    {
        printf("%d\n", d->i);
        return 0;
    }

};

int main()
{
    A *a = new A;

    a->process();

    return 0;
}
4

5 回答 5

3
d.func(&d);

是不足够的。func是一个成员函数指针,它指向 的非静态成员A。所以它可以在A. 所以你需要这样写:

(this->*(d.func))(&d);

只要你在里面写这个就行了A

如果你想func从外部执行,比如 in main(),那么语法是这样的:

A a; 
(a.*(a.d.func))(&a.d);

这是一个丑陋的语法。

于 2013-01-14T18:39:09.777 回答
1

您的process函数尝试调用d.func,但它是指向成员函数的指针。必须在某个对象上调用指向成员函数的指针。大概您希望 to 的实例为Athis在这种情况下,您的process函数应如下所示:

void process()
{
    (this->*(d.func))(&d);
}

注意->*当你有一个指向它的指针时使用操作符来调用一个成员函数。

于 2013-01-14T18:38:42.207 回答
0

其他答案已经说过您需要说(this->*d.func)(&d)调用指向成员函数的指针(因为您需要提供它所属的对象

另一种选择是使函数成为静态函数,它不需要特殊的语法来调用。为此,请像这样更改 typedef:

typedef int (*func_t)(data *);

然后将print函数设为静态:

static int print(data *d)
{
    ...
}

现在你可以打电话d.func(&d)

于 2013-01-14T18:49:48.087 回答
-1

不幸的是,您尝试做的事情是不可能的,原因是这print不是static成员函数。这意味着它需要一个隐式的第一个参数,即this指针。

我建议您尝试使用std::functionandstd::bind函数,如下所示:

class A
{
    struct data
    {
        std::function<void(const data&)> func;
        int i;
    };

    data d;

public:
    A()
    {
        d.func = std::bind(&A::print, *this);
        d.i = 999;
    }

    void process()
    {
        d.func(d);
    }

    void print(const data& my_data)
    {
        std::cout << my_data.i << '\n';
    }
};

当然,由于print函数现在有了正确的this指针,您不再需要将数据结构传递给它:

class A
{
    struct data
    {
        std::function<void()> func;
        int i;
    };

    data d;

public:
    A()
    {
        d.func = std::bind(&A::print, *this);
        d.i = 999;
    }

    void process()
    {
        d.func();
    }

    void print()
    {
        std::cout << d.i << '\n';
    }
};
于 2013-01-14T18:39:47.140 回答
-2

调用指针成员需要它所属的类是 this 参数。

尝试:

A a;
a.*(d.func)(&d);
于 2013-01-14T18:40:26.773 回答