获取重载静态函数的地址

Aus*_*ner 5 c++

可能重复:
如何指定指向重载函数的指针?

我有一个库,其类定义为:

struct ClassA
{
    static ClassA foo(long);
    static ClassA foo(double);
}
Run Code Online (Sandbox Code Playgroud)

我需要获取这两个函数的地址.我正在尝试的代码给出错误C2440:无法从'overloaded-function'转换为'...'

ns::ClassA (ns::ClassA::*ClassA_foo1)(long) = &ns::ClassA::foo;
ns::ClassA (ns::ClassA::*ClassA_foo2)(double) = &ns::ClassA::foo;
Run Code Online (Sandbox Code Playgroud)

我认为它们可能是静态的,但在返回类型之前或之后放置静态会产生相同的错误.

Aar*_*aid 5

函数重载的事实并不真正相关.这里真正的问题是函数指针和成员函数指针之间的区别.我会在不重载的情况下运行一些示例.

解决方案:删除static,以将它们定义为成员函数.或者替换ns::ClassA::*ClassA_foo1*ClassA_foo1.我想你想要后者.(但我实际上建议你使用typedef,正如其他人已经建议的那样).

考虑这两个:

namespace ns {
struct ClassA
{
    static ClassA foo(long);
};
}
Run Code Online (Sandbox Code Playgroud)

namespace ns {
struct ClassA
{
    ClassA foo(long);
};
}
Run Code Online (Sandbox Code Playgroud)

在前一种情况下,foo是static并且因此是典型的函数,并且可以存储在函数指针中:

ns::ClassA (ClassA_foo1)(long) = &ns::ClassA::foo;
Run Code Online (Sandbox Code Playgroud)

如果你删除了static,那么它不再是一个函数,它是一个成员函数.指向成员函数的指针与指向函数的指针不同,它们必须使用一个对象来执行,该对象将this是调用该方法的对象.

函数指针的类型包括返回值的类型和参数的类型.但是指向成员函数的指针类型还必须包含this对象的类型- 您不希望能够从Circle类型对象上运行方法BankAccount.

声明指向函数的指针:

 ReturnType (*variable_name) (PARAM1, PARAM2)
Run Code Online (Sandbox Code Playgroud)

声明指向成员函数的指针:

 ReturnType (ThisObjectType::*variable_name) (PARAM1, PARAM2)
Run Code Online (Sandbox Code Playgroud)

最后一行是有趣的.乍一看,您可能认为R (A::*v) (P1,P2)声明了一个普通的函数指针并将结果变量v放入A范围.但事实并非如此.相反,它定义了一个指向成员的指针函数,该函数对类型的对象进行操作A.