2016-09-28 2 views
0

Ich habe diesen Code für eine Node-basierte Queue-Implementierung und ich soll eine abstrakte Klasse namens QueueInterface erweitern.Fehler beim Erweitern einer Vorlage abstrakte Klasse

template<typename T> 
struct QueueInterface { 
    public: 
    virtual ~QueueInterface(){}; 
    virtual bool isEmpty() const = 0; 
    virtual void enqueue(const T value) = 0; 
    virtual void dequeue() throw(PreconditionViolationException) = 0; 
    virtual T peekFront() const throw(PreconditionViolationException) = 0; 
};  

template<typename T> 
struct Queue : QueueInterface { 
    Queue(); 
    ~Queue(); 
    bool isEmpty() const; 
    void enqueue(const T value); 
    void dequeue() throw(PreconditionViolationException); 
    T peekFront() const throw(PreconditionViolationException); 

private: 
    Node<T>* front; 
    Node<T>* back; 
}; 

Ich halte einen expected class name before '{' token Fehler bekommen, obwohl ich die QueueInterface Header-Datei enthalten. Warum passiert dies?

+1

Wahrscheinlich gibt es in 'Node.h' oder' QueueInterface.h' ein Tippfehler ist. – NathanOliver

+0

Gibt es nicht. Ich überprüfte. Auch warum würde ein Tippfehler in 'Node.h' diesen Fehler werfen – pyro97

+0

Dies wird ein Ratespiel sein, ohne den Inhalt der anderen Dateien zu kennen. Kannst du sie so gut wie möglich reduzieren und trotzdem den Fehler bekommen? TIA (PS: mein Geld fehlt, am Ende einer Klassendeklaration) – Borgleader

Antwort

1

QueueInterface ist keine Klasse. Sie können von etwas erben, das keine Struktur oder Klasse ist. Diese Sache nennt man eine Vorlagenklasse. Sie können Vorlagen mit der template<...> kurz vor der Vorlagenklasse erkennen. Sie müssen einen Typ angeben, damit der Compiler eine Klasse dieses Typs erstellen kann.

In Ihrem Fall versuchen Sie, eine Struktur zu erstellen, die auch eine Vorlage ist. Durch die an den Überschreibungen der Methoden Ihrer Basisklassen suchen, ich glaube, Sie versuchen, dies zu tun:

template<typename T> 
struct Queue : QueueInterface<T> { 
    // notice that there ---^--- you are sending the required parameter 

    // defaulted members are good. 
    Queue() = default; 

    // override too. 
    bool isEmpty() const override; 
    void enqueue(const T value) override; 
    void dequeue() throw(PreconditionViolationException) override; 
    T peekFront() const throw(PreconditionViolationException) override; 

private: 
    Node<T>* front; 
    Node<T>* back; 
}; 
Verwandte Themen