35

在我的类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
}

为什么会这样?

4

3 回答 3

46

的类型与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++ 引入了一种新类型的指针,称为指向成员的指针,它只能通过提供 object 来调用

注意:不要试图将指向成员函数的指针“转换”为指向函数的指针;结果是不确定的,可能是灾难性的。例如,指向成员函数的指针不需要包含适当函数的机器地址。如上一个示例所述,如果您有一个指向常规 C 函数的指针,请使用顶级(非成员)函数或静态(类)成员函数。

更多关于这里这里

于 2013-04-05T19:18:54.667 回答
9

这里的问题是它f2是一个方法 on Mat,而f只是一个自由函数。你不能自己调用f2​​,它需要一个实例Mat来调用它。解决这个问题的最简单方法可能是:

printf("%d\n", test([=](int v){return this->f2(v);}, 5));

那里将=捕获this,这是您需要调用f2的。

于 2013-04-05T19:01:15.297 回答
-1

我因未使用括号进行函数调用而收到此错误。我有这个:

Eigen::Quaterniond value; ... myFunction(value.x);

我通过将最后一行更改为以下内容来解决此问题:

myFunction(value.x());

于 2019-09-17T00:34:16.950 回答