<未解析的重载函数类型>

<unresolved overloaded function type>

本文关键字:gt 函数 类型 重载 lt      更新时间:2023-10-16

在我的名为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("%dn",test(f ,5));    // works
    printf("%dn",test(f2 ,5));    // does not work
}

为什么会发生这种情况?

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++中,成员函数有一个隐式参数,它指向对象(成员函数内部的此指针(。正常C函数可以被认为具有不同的调用约定从成员函数中,因此其指针的类型(指向成员函数的指针与指向函数的指针(不同,并且不兼容C++引入了一种新类型的指针,称为指向成员的指针,该指针只能通过提供对象来调用

注意:不要试图将指向成员函数的指针"强制转换"到指向函数的指针;结果是不确定的,可能是灾难性的。例如,指向成员函数的指针不需要包含适当功能的机器地址正如上次所说例如,如果您有一个指向正则C函数的指针,请使用顶级(非成员(函数或静态(类(成员函数。

这里和这里有更多关于这个的信息。

这里的问题是f2Mat上的一个方法,而f只是一个自由函数。你不能单独调用f2,它需要一个Mat的实例来调用它

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

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