3

所以我试图弄清楚当模板混合时继承是如何工作的。大多数编译器似乎还没有弄清楚这一点,所以我遇到了一点语法困难。SkipNode.h 中所有奇怪的包含都来自试图让 eclipse 停止对我大喊大叫。尝试在 SkipNode.h 中声明构造函数时出现语法错误,因此此处的任何帮助都会很有用。

这是node.h

#ifndef NODE_H_
#define NODE_H_

template<class T>
class Node
{
public:

    Node(Node<T>* next, Node<T>* prev, T item);

    virtual ~Node();

    Node* getPrev() { return prev;};

    Node* getNext() { return next;};

    Node* getItem() { return item;};

    void setItem(T item){Node<T>::item = item;};

    void setNext(Node* next){Node<T>::next = next;};

    void setPrev(Node* prev){Node<T>::prev = prev;};
private:
    Node* next;
    Node* prev;
    T item;
};

这是 SkipNode.h,其中 skipnode 继承自 Node。

#include "Node.h"
#include "Node.cpp"
#include "SkipNode.h"
#include "SkipNode.cpp"

template <class T>
class SkipNode: public Node
{
public:
    SkipNode(Node<T>* next, Node<T>* prev, Node<T>* child, T item) : Node(next, prev, item);

    virtual ~SkipNode();

    Node* getChild(){return child;};

    void setChild(Node* child){SkipNode::child = child;};

private:
    Node *child;
};

#endif /* SKIPNODE_H_ */
4

2 回答 2

5

Node是一个模板,你应该传入模板参数

template <class T>
class SkipNode: public Node<T>
//                         ^^^

您还需要提供您提供的SkipNode构造函数定义member iniatilizer list

更新:

SkipNode(Node<T>* next, Node<T>* prev, Node<T>* child, T item) 
: Node(next, prev, item);

至:

SkipNode(Node<T>* next, Node<T>* prev, Node<T>* child, T item)
: Node(next, prev, item)
{
}
于 2013-09-29T01:52:30.413 回答
-1

#endif在 node.h 中缺少一个,您需要为您的基类提供模板参数:

template <class T>
class SkipNode : public Node< T >
....

存在这种间接级别是为了允许具有不同(或零)模板参数的类从模板类继承。例如:

class Foo : public Node< int >
于 2013-09-29T01:56:08.117 回答