gpt4 book ai didi

c++ - 将基本模板类的派生类作为其基本模板类传递给函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:23:21 25 4
gpt4 key购买 nike

我正在实现一个事件系统,其中添加的事件存储在我已实现的链表中。向事件系统订阅事件时,我试图传递 EventHandler* 类型的对象, 派生自基本模板类 IntrusiveLink<T> , 我链表的方法 void Append(IntrusiveLink<T>* pLink);作为EventHandler* .

我原以为它会从继承的“is-a”关系中自动升级,但我似乎误解了这里实际发生的事情,或者我的语法不正确。

这里是编译错误。

cannot convert argument 1 from 'EventHandler*' to 'IntrusiveLink<T>' with T=EventHandler *. Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

这是基本模板类

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
}

我尽量让片段与问题相关,但如果您需要更多信息,请告诉我。谢谢。

最佳答案

您的列表模板 IntrusiveLinkedList有一个类型 EventHandler*

IntrusiveLinkedList<EventHandler*> m_eventHandlers;

,所以 Append函数期望 IntrusiveLink<EventHandler*>* , 不是 IntrusiveLink<EventHandler>* .顺便说一句,在您的示例中不需要使用模板(至少在您展示的部分中)。继承就足够了。

关于c++ - 将基本模板类的派生类作为其基本模板类传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188985/

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