函数重载这一事实并不真正相关。这里真正的问题是函数指针和成员函数指针之间的区别。我将在不重载的情况下运行一些示例。
解决方案:要么删除static
,以便将它们定义为成员函数。不然就换ns::ClassA::*ClassA_foo1
with *ClassA_foo1
。我想你想要后者。 (但我实际上建议你使用typedef
,正如其他人已经建议的那样)。
考虑这两个:
namespace ns {
struct ClassA
{
static ClassA foo(long);
};
}
and
namespace ns {
struct ClassA
{
ClassA foo(long);
};
}
在前一种情况下, foo 是static
因此是一个典型的函数,可以存储在函数指针中:
ns::ClassA (ClassA_foo1)(long) = &ns::ClassA::foo;
如果您删除static
,那么就是not它不再是一个函数,它是一个成员函数。指向成员函数的指针与指向函数的指针不同,它们必须使用一个对象来执行,该对象将是this
调用该方法的对象。
函数指针的类型包括返回值的类型和参数的类型。但指向成员函数的指针的类型还必须包括该成员函数的类型this
对象 - 您不会期望能够从Circle
在类型的对象上BankAccount
.
声明一个函数指针:
ReturnType (*variable_name) (PARAM1, PARAM2)
声明一个指向成员函数的指针:
ReturnType (ThisObjectType::*variable_name) (PARAM1, PARAM2)
最后一行是有趣的一行。乍一看,你可能会认为R (A::*v) (P1,P2)
声明一个普通的函数指针并放置结果变量v
进入A
范围。但事实并非如此。相反,它定义了一个指向成员函数的指针,该函数对类型的对象进行操作A
.