gpt4 book ai didi

c++ - 调用指向派生类成员的指针时,指向与对象类型不兼容的成员类型的指针

转载 作者:行者123 更新时间:2023-11-30 03:37:19 27 4
gpt4 key购买 nike

我已经定义了一个这样的类模板:

template <const category_id_t category, class Base>
class Node : public Base
{
...
template <typename Derived, class T>
void on_message( const frame_t& frame, void (Derived::*call)(const T*) )
{
if ( frame.length == sizeof(T) )
(this->*(call))((T*)frame.data);
}
}

参数category作为实现几个相似类的标记,并根据特定类别提供适当的特化。上面的类是这样派生的:

template <class Base>
class Sys : public Node<CID_SYS, Base>
{
Sys() : Node<CID_SYS, Base>() { /* ... */ }
....
};

Sys只是一个为类别 CID_SYS 的对象提供基接口(interface)的类(enum, value = 5) 并作为接口(interface)实际实现的基类:

class SysImpl : public Sys<CAN>
{
...
/* Parse remote notifications */
void on_notify( const state_info_t* ) { /* ... */ }
};

SysImpl sys;

最后我有一个调用基类的函数Node<CID_SYS, Base>成员函数 on_message()像这样:

void foo(const frame_t& frame)
{ sys.on_message(frame, &SysImpl::on_notify ); }

编译器在 (this->*(call))((T*)frame.data) 行附近抛出错误说

error: pointer to member type 'void (SysImpl::)(const state_info_t*)' is incompatible with object type 'Node<(category_id_t)5u, CAN>'

编译器已经成功猜到了要调用的模板函数,只是它似乎没有“识别”this来自派生类。

我想要的是调用从 Node<CID_SYS, CAN> 派生的类的任何成员函数,不仅是独立功能(到目前为止运行良好,上面的摘录中没有显示)。

我错过了什么?

最佳答案

on_message函数变量 this不是指向 SysImpl 的指针, 它的类型是 Node<CID_SYS, CAN>* . Node模板类没有成员on_notify所以你不能在 Node 的实例上调用它.它必须在 Derived 的实例上调用(应该是 SysImpl )。

这就是为什么您会收到错误并需要转换 this 的原因至 Derived* :

(static_cast<Derived*>(this)->*(call))(...);

当然,这只适用于 Derived实际上源自Node类。

关于c++ - 调用指向派生类成员的指针时,指向与对象类型不兼容的成员类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40265798/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com