我知道这听起来令人困惑,我有一个基本模板类,它有一个函数指针,一个子类(不再是模板类)需要使用该函数指针指向子类的成员函数,并且我遇到各种错误..我是否违反了一些C ++的普遍规律? 这是伪代码:
template <class T>
class Base{
public:
typedef void (Base<T>::*fptr) (char in);
void funcA(fptr FuncToCall){
FuncToCall('a');
}
...
};
class Child:public Base<char>{
public:
void funcToCall(){...}
void funcB(){
funcA(funcToCall);
}
}
以下是我收到的错误消息:
错误C2664:'Base&lt; T&gt; :: funcA':不能 从'void转换参数1 (__thiscall Child :: *)(char)'to'void (__thiscall Base&lt; T&gt; :: *)(char)'
答案 0 :(得分:9)
您的代码无效。
首先,在C ++中创建指向成员函数的指针,总是必须使用运算符&
和成员的限定名,这意味着您对{{{ 1}}应如下所示
funcA
其次,成员指针是逆变。如果要使用derived-member指针值初始化基本成员指针对象,则必须使用显式funcA(&Child::funcToCall); // close, but not yet, see "secondly"
static_cast
请注意,这是一个有效但可能不安全的转换,因为现在您有责任确保在调用的左侧使用的实际对象(请参阅“第三个”)具有该成员。
第三,为了通过这样的指针调用函数,你必须在左侧提供一个具体的对象,所以funcA(static_cast<fptr>(&Child::funcToCall));
中的调用应该如下所示(我假设你想要将其称为funcA
对象)
*this
第四,你的(this->*FuncToCall)('a');
应该有一个参数。它在哪里?