2013-09-29 174 views
3

所以我試圖弄清楚當模板混合時繼承是如何工作的。大多數編譯器似乎還沒有這個想法,所以我有一點語法困難。 SkipNode.h中包含的所有奇怪的東西都是試圖讓Eclipse停止向我大喊大叫。在嘗試在SkipNode.h中聲明構造函數時出現語法錯誤,所以這裏的任何幫助都會有用。從C++模板類繼承的問題

這裏是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從節點繼承。

#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_ */ 

回答

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) 
{ 
} 
+0

我做你建議的修改,但它仍然不喜歡這裏的東西..我已經嘗試了這些變化沒有任何的運氣 –

+0

,如果你真正發佈錯誤消息,這將是有幫助的。你可能會有更多的錯誤。 – billz

+0

錯誤是「語法錯誤」 –

-1

你錯過了在node.h一個#endif,你需要提供模板參數的基礎類:

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

這種間接級別的存在是爲了允許不同類的模板類繼承租用(或零)模板參數。例如:

class Foo : public Node<int>