在调用指向派生类

时间:2016-10-26 15:03:52

标签: c++ templates derived-class pointer-to-member

我已经定义了一个类模板,例如:

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(enum,value = 5)的对象提供基接口的类,并且作为接口实际实现的基类:

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)附近引发错误

  

错误:指向成员类型的指针&#39; void(SysImpl ::)(const state_info_t *)&#39;与对象类型不兼容&#39;节点&lt;(category_id_t)5u,CAN&gt;&#39;

编译器已经成功猜到了要调用的模板函数,它只是看起来没有&#34;识别&#34; this来自派生类。

我想要的是调用从Node<CID_SYS, CAN>派生的类的任何成员函数,而不仅仅是独立函数(到目前为止工作得很好,在上面的摘录中没有显示)。 / p>

我错过了什么?

1 个答案:

答案 0 :(得分:2)

on_message函数中,变量this不是指向SysImpl的指针,它的类型为Node<CID_SYS, CAN>*Node模板类没有成员on_notify,因此您无法在Node的实例上调用它。必须在Derived的实例(应该是SysImpl)上调用它。

这就是您收到错误并需要将this投射到Derived*的原因:

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

当然,这仅适用于从Derived类派生的Node实际