在我的名为Mat
的类中,我希望有一个函数将另一个函数作为参数。现在我有以下4个函数,但是在调用print()时遇到错误。第二行给了我一个错误,但我不明白为什么,因为第一行有效。唯一的区别是函数f
不是类Mat
的成员,但f2
是。
失败的是:error: no matching function for call to Mat::test( < unresolved overloaded function type>, int)'
template <typename F>
int Mat::test(F f, int v){
return f(v);
}
int Mat::f2(int x){
return x*x;
}
int f(int x){
return x*x;
}
void Mat::print(){
printf("%d\n",test(f ,5)); // works
printf("%d\n",test(f2 ,5)); // does not work
}
为什么会这样?
答案 0 :(得分:38)
pointer-to-member-function
的类型与pointer-to-function
不同。
函数的类型根据它是某个类的普通函数还是非静态成员函数而有所不同:
int f(int x);
the type is "int (*)(int)" // since it is an ordinary function
并且
int Mat::f2(int x);
the type is "int (Mat::*)(int)" // since it is a non-static member function of class Mat
注意:如果它是类Fred的静态成员函数,则其类型与普通函数相同:"int (*)(char,float)"
在C ++中,成员函数有一个指向的隐式参数 对象(成员函数内的this指针)。正常C. 函数可以被认为具有不同的调用约定 来自成员函数,所以它们的指针类型 (指向成员函数的指针与指向函数的指针)是不同的 不兼容。 C ++引入了一种新类型的指针,称为a 指向成员的指针,只能通过提供对象来调用。
注意:不要试图将指针指向成员函数“强制转换”为 指针到功能;结果是不明确的,可能是灾难性的。 例如,指向成员函数的指针不需要包含 机器地址的相应功能。正如前面所说 例如,如果您有一个指向常规C函数的指针,请使用a 顶级(非成员)函数或静态(类)成员函数。
答案 1 :(得分:5)
这里的问题是f2
是Mat
上的方法,而f
只是一个自由函数。您无法单独调用f2
,它需要Mat
的实例才能将其调用。最简单的方法可能是:
printf("%d\n", test([=](int v){return this->f2(v);}, 5));
=
会抓取this
,这是您需要致电f2
。
答案 2 :(得分:0)
由于没有在函数调用中使用括号而导致此错误。我有这个:
Eigen::Quaterniond value;
...
myFunction(value.x);
我通过将最后一行更改为此来解决此问题:
myFunction(value.x());