我已经根据一些搜索应用了解决方案,但问题仍然存在。非常感谢你的帮助。
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;
}
答案 0 :(得分:3)
d.func(&d);
还不够。 func
是一个成员函数指针,指向A
的非静态成员。因此可以在A
的对象上调用它。所以你需要写这个:
(this->*(d.func))(&d);
只要你在A
内写下这个就行了。
如果你想从外面执行func
,比如main()
,那么语法是:
A a;
(a.*(a.d.func))(&a.d);
这是一种难看的语法。
答案 1 :(得分:1)
您的process
函数尝试调用d.func
,但它是指向成员函数的指针。必须在某个对象上调用指向成员函数的指针。大概您希望A
的实例为this
,在这种情况下,您的process
函数应如下所示:
void process()
{
(this->*(d.func))(&d);
}
注意使用->*
运算符在有指向它的指针时调用成员函数。
答案 2 :(得分:0)
其他答案已经说过你需要说(this->*d.func)(&d)
来调用指向成员的指针函数(因为你需要提供它是 成员的对象)
另一种选择是使函数成为静态函数,不需要特殊的语法来调用。为此,请更改typedef,如下所示:
typedef int (*func_t)(data *);
然后将print
函数设为静态:
static int print(data *d)
{
...
}
现在您可以致电d.func(&d)
答案 3 :(得分:-1)
不幸的是,您尝试做的事情是不可能的,原因是print
不是static
成员函数。这意味着它需要一个隐含的第一个参数,即this
指针。
我建议您尝试使用std::function
和std::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';
}
};
答案 4 :(得分:-2)
调用指针成员需要它所属的类成为此参数。
尝试:
A a;
a.*(d.func)(&d);