我正在实现一个事件系统,其中添加的事件存储在我已实现的链接列表中。在事件系统中订阅事件时,我试图将类型为EventHandler*
的对象(源自基本模板类IntrusiveLink<T>
)传递给我的链接列表的方法void Append(IntrusiveLink<T>* pLink);
EventHandler*
。
我原以为它会从'is-a'继承关系中自动升级,但我似乎误解了这里可能发生的事情,或者我的语法不正确。
这是编译器错误。
无法将参数1从'EventHandler *'转换为'IntrusiveLink&lt; T&gt;'用T = EventHandler *。指向的类型是无关的;转换需要 reinterpret_cast,C风格的演员表或函数式演员
这是基本模板类
template <class T>
class IntrusiveLink
{
IntrusiveLink<T>* m_pPrev;
IntrusiveLink<T>* m_pNext;
protected:
IntrusiveLink()
: m_pPrev(nullptr), m_pNext(nullptr) {}
public:
virtual ~IntrusiveLink() {m_pPrev = nullptr; m_pNext = nullptr;}
};
IntrusiveLink派生类的片段
class EventHandler : public IntrusiveLink<EventHandler>
{
// ... other code
};
链表的小片段
template <class T>
class IntrusiveLinkedList
{
// ... other code
void Append (IntrusiveLink<T>* pLink);
};
事件系统标题的片段
class EventSystem
{
IntrusiveLinkedList<EventHandler*> m_eventHandlers;
public:
void Subscribe (EventHandler* pEventHandler);
... other code
};
最后,发生错误的片段
void EventSystem::Subscribe(EventHandler* pEventHandler)
{
// ... other code
m_eventHandlers.Append(pEventHandler); // Compiler error
}
我尝试将代码段与问题相关联,但如果您需要更多信息,请与我们联系。感谢。
答案 0 :(得分:0)
您的列表模板IntrusiveLinkedList
的类型为EventHandler*
IntrusiveLinkedList<EventHandler*> m_eventHandlers;
,因此Append
函数需要IntrusiveLink<EventHandler*>*
,而不是IntrusiveLink<EventHandler>*
。
顺便说一句,在您的示例中不需要使用模板(至少在您展示的部分中)。继承就足够了。
答案 1 :(得分:0)
据我所知,只有指向基类的指针才能指向派生实例。要从派生类转换为基类,您必须使用:operator baseClass();
创建转换函数http://en.cppreference.com/w/cpp/language/cast_operator
中对此进行了解释我很难说你可以制造&#34; operator baseClass(baseClass obj); &#34;,我没有找到这样的例子,但你可以远离测试。