2016-08-19 2 views
1

Ich bin neu in der C++ Sprache und brauche Hilfe mit dem Problem unten. Momentan versuche ich, "Vorlagen" und "Funktionszeiger" zu verstehen. Die folgende Template-Klasse, Queue, kompiliert, wenn sie in eine einzige CPP-Datei geschrieben:Vorlagen und Funktionspointer: Wie definiere ich einen Funktionszeiger, der in einer Template-Klasse deklariert wurde?

template <typename T> class Queue 
{ 
    public: 
    Queue() 
    { 
     m_add = m_remove = 0; 
    } 
    void enque(T *c) 
    { 
     m_array[m_add] = c; 
     m_add = (m_add + 1) % SIZE; 
    } 
    T *deque() 
    { 
     int temp = m_remove; 
     m_remove = (m_remove + 1) % SIZE; 
     return m_array[temp]; 
    } 
    private: 
    enum 
    { 
     SIZE = 8 
    }; 
    T *m_array[SIZE]; 
    int m_add, m_remove; 
}; 

Allerdings, wenn ich diesen Code in die .h und CPP-Dateien trennen (wie unten), erhalte ich Fehler, wo ich bin Definieren des Funktionszeigers in der CPP-Datei; in der Nähe der Linie:

template<typename T> 
T (Queue<T>::*deque)() { 

Queue.h:

#ifndef QUEUE_H_ 
#define QUEUE_H_ 

template<typename T> 
class Queue { 
    enum { 
     SIZE = 8 
    }; 
    T *m_array[SIZE]; 
    int m_add, m_remove; 
public: 
    Queue(); 
    virtual ~Queue(); 
    void enque(T *c); 
    T *deque(); 
}; 

#endif /* QUEUE_H_ */ 

Queue.cpp:

#include "Queue.h" 

template<typename T> 
Queue<T>::Queue() { 
    m_add = m_remove = 0; 
} 

template<typename T> 
Queue<T>::~Queue() { 
} 

template<typename T> 
void Queue<T>::enque(T *c) { 
    m_array[m_add] = c; 
    m_add = (m_add + 1) % SIZE; 
} 

template<typename T> 
T (Queue<T>::*deque)() { 
    int temp = m_remove; 
    m_remove = (m_remove + 1) % SIZE; 
    return m_array[temp]; 
} 

Ich hoffe, dass einer von euch C++ Experten könnte mir helfen, zu verstehen, wie das definieren, Funktionszeiger < T * deque()> Vielen Dank im Voraus für Ihre Hilfe.

+0

Sie sollten auf "* C++ Zeiger *" achten, und wie sie funktionieren. Weil Ihr Code potenziell unsicher ist! –

+0

@Biagio, danke für die Warnung. – Otelagh

Antwort

1

Ihre Implementierung stimmt nicht mit Ihrer Deklaration überein (offensichtlich). Ihre Funktion wird erklärt, wie:

template<class T> 
class Queue 
{ 
    //... other members 

    T* deque(); 
}; 

Außerhalb der Klasse Körper, das wird:

template<class T> 
T* Queue<T>::deque() 

Das heißt, Sie müssen dies lesen: "Why can templates only be implemented in the header file". Es wird erklären, warum es sehr wahrscheinlich ein Fehler war, dass Sie Ihre Vorlagenimplementierung in eine cpp-Datei verschoben haben, von wo sie hingehört: die Kopfzeile.

+0

danke für den Link. Es war hilfreich. Ich nahm Ihren Rat und legte die Implementierung in eine .tpp-Datei, um am Ende der Header-Datei enthalten sein. Ich habe immer noch Probleme bei der Definition der Funktion * deque(). Frage: Wenn Sie die obige Funktion * deque() in einer separaten .tpp-Datei definieren würden, wie würden Sie das tun? Ich bin immer noch in kompilierte Fehler für nur diese eine Funktion (* deque()) stecken. – Otelagh

+0

"Wie würdest du es machen" - * würde ich nicht *. Ich würde die Template-Deklaration und die Implementierung einschließlich der Out-of-Line-Implementierungen in die Header-Datei, wo sie hingehören, setzen. Es gibt keinen Gewinn * wie auch immer, um es in separate Header + etwas anderes zu teilen. Bezüglich des Kompilierens ist die Syntax zum Definieren dieses Klassenschablonenelements außerhalb des Klassenkörpers * genau *, wie ich es in meiner Antwort zeige. Wenn Sie weiterhin Fehler bei der Kompilierung erhalten, sollten Sie Ihrer Frage einen Anhang mit dem aktualisierten Quellcode hinzufügen. – WhozCraig

+0

... hat es funktioniert. Ich musste einfach "putzen", bevor die Kompilierung funktionieren würde. Danke, WhozCraig. RE: "Es gibt keinerlei Gewinn ..." Ich höre was du sagst. Ich bin neu in der C++ Sprache, also versuche ich herauszufinden, was funktioniert und warum. Der Link, den Sie mir gegeben haben, schien zu implizieren, dass die Deklaration der Vorlagen von den Implementierungen entfernt war und dass die Verwendung der .tpp-Datei dieses Ziel erreichen würde. – Otelagh

Verwandte Themen