我基本上想要使用dif函数来提取类(ac)的不同元素。
代码类似于:
·H:
class MyClass
{
public:
double f1(AnotherClass &);
void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &));
};
.CC:
double MyClass::f1(AnotherClass & ac)
{
return ac.value;
}
void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &))
{
std::cout << f1(ac);
}
不起作用,它给错误#547“非标准形式获取成员函数的地址”
编辑:
我从以下地方致电:
void MyClass(AnotherClass & ac)
{
return f0(ac,&f1); // original and incorrect
return f0(ac,&Myclass::f1); //solved the problem
}
但是,我还有另一个错误:
std::cout << f1(ac);
^ error: expression must have (pointer-to-) function type
答案 0 :(得分:4)
查看错误指向的位置。我打赌它不在函数声明行上,而是在你如何调用它。
观察:
struct foo
{
void bar(void (foo::*func)(void));
void baz(void)
{
bar(&foo::baz); // note how the address is taken
bar(&baz); // this is wrong
}
};
您收到错误是因为您错误地调用了该函数。鉴于上面的foo
,我们知道这不起作用:
baz(); // where did the foo:: go?
因为baz
需要调用实例。你需要给它一个(我假设this
):
std::cout << (this->*f1)(ac);
语法有点奇怪,但是这个运算符->*
说:“取右边的成员函数指针,并用左边的实例调用它。” (还有.*
运算符。)
答案 1 :(得分:1)
您仍未发布创建指向成员的指针的代码,这是错误似乎的内容,但是您使用它的方式存在问题。
要使用指向成员的指针,您需要使用->*
或.*
运算符之一,并使用指针或对类的相应实例的引用。 E.g:
void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &))
{
std::cout << (this->*f1)(ac);
}
您可以像这样调用函数:
void f()
{
AnotherClass ac;
MyClass test;
test.f0( ac, &MyClass::f1 );
}
请注意,对于指向成员的指针,您需要&
,这与通常隐式转换为函数指针的函数名称不同。