我已经定义了一个类模板,例如:
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>
我错过了什么?
答案 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
实际 。