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

时间:2015-12-09 21:06:43

标签: c++ templates inheritance

我正在实现一个事件系统,其中添加的事件存储在我已实现的链接列表中。在事件系统中订阅事件时,我试图将类型为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
}

我尝试将代码段与问题相关联,但如果您需要更多信息,请与我们联系。感谢。

2 个答案:

答案 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;,我没有找到这样的例子,但你可以远离测试。