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