Templates mit VC++ 6.0



  • Hallo zusammen,

    ich schreibe mal in dieses Topic, weil ich vermute, dass ich an Visual Studio 6.0 scheitere.
    Ich möchte einen generischen Buffer mit Hilfe von Templates realisieren, mein Projekt hat 3 Dateien: Headerdatei, dazugehörige Cpp-Datei, und eine Cpp-Datei zum Testen.
    Hier die wichtigsten Auszüge:

    dynamicbuffer.h

    #ifndef DYNAMIC_BUFFER_H
    #define DYNAMIC_BUFFER_H
    
    #include <stdio.h>
    
    template<class T>
    class DynamicBuffer
    {
    	public:
    		DynamicBuffer ();
    		void enqueue (T x);
    		void dequeue (T &x);
    		bool nonEmpty ();
    	private:
    		struct ListElem;
    		ListElem* head;
    		ListElem* tail;
    };
    
    #endif
    

    dynamicbuffer.cpp

    #include "dynamicbuffer.h"
    
    template<class T>
    struct DynamicBuffer<T>::ListElem
    {
    	T value;
    	ListElem *next;
    };
    
    // ...
    
    template<class T>
    void DynamicBuffer<T>::enqueue (T x)
    {
    	ListElem *in;
    
    	in = new ListElem;    // Zeile 25
    	in->value = x;
    	in->next = NULL;
    
    	// ...
    
    }
    
    // ...
    

    dynamicbuffertest.cpp

    #include "dynamicbuffer.cpp"
    
    #include <iostream>
    using namespace std;
    
    int main ()
    {
    	DynamicBuffer<int> intBuffer;
    
    	intBuffer.enqueue (10);
    	return 0;
    }
    

    Das Instantiieren des Buffers verläuft noch ohne Fehler, aber sobald ich enqueue aufrufe, bekomme ich Fehler dieser Art:

    ...\dynamicbuffer.cpp(25) : error C2512: 'ListElem' : Kein geeigneter Standardkonstruktor verfuegbar
    ...\dynamicbuffer.cpp(26) : error C2027: Verwendung des undefinierten Typs "ListElem"
    

    Er scheint also irgendwie ListElem nicht zu kennen bzw. erzeugen zu können.
    Den Code hab ich mehrmals kontrolliert und mit ähnlichem verglichen, deswegen denke ich, dass ich evtl. compilerspezifische Fehler gemacht habe.

    Für jegliche Hilfe bin ich dankbar, weil es echt schwierig ist, dieses Problem mit Google & Co. zu beheben.

    Viele Grüße



  • ListElem ist halt nciht definiert, ganz einfach.



  • Ist das

    template<class T>
    struct DynamicBuffer<T>::ListElem
    {
        T value;
        ListElem *next;
    };
    

    (s. dynamicbuffer.cpp) denn keine Definition? Wenn nicht, wie muss es dann richtig aussehen?



  • sorry, das habe ich wohl übersehen.
    Ich erinner mich, dass es mit dem VC++6 Probleme mit Templates gab: Man konnte seine Template-Klassen nicht in Header- und Source-Datei auftrennen. Möglicherweise spielt das hier mit rein?


  • Mod

    Tlyman schrieb:

    Ist das

    template<class T>
    struct DynamicBuffer<T>::ListElem
    {
        T value;
        ListElem *next;
    };
    

    (s. dynamicbuffer.cpp) denn keine Definition? Wenn nicht, wie muss es dann richtig aussehen?

    Doch das ist eine!
    Das Problem ist nur, dass VC6 einfach nicht zuverlässig mit templates arbeitet.

    Setze die Deklaration mal in die temnplate Klasse!



  • Mit der Definition direkt in der Headerdatei klappt jetzt alles, vielen Dank. Einerseits gut zu wissen, dass es doch "nur" an VC++ lag, andererseits werde ich mir vielleicht doch mal einen besseren Compiler raussuchen müssen, wenn ich das sauber trennen möchte.

    Viele Grüße,

    Tlyman



  • Einfach auf das aktuelle Visual Studio umsteigen. VC++6.0 ist immerhin inzwischen fast ein Jahrzehnt alt...



  • Hat es einen bestimmten Grund dass du nicht std::deque oder std::list verwendest?
    Ich meine wenn du eine eigene DynamicBuffer Klasse haben willst mit eigenem Interface, dann kannst du ja immernoch zur Implementierung von DynamicBuffer std::deque oder std::list verwenden ... nicht?
    (Oder std::vector als Ringbuffer)



  • Hehe, leider ist mein Laptop auch fast ein Jahrzehnt alt und Visual Studio 2005 doch ein großer Klotz ressourcenfressender Software 😉

    Der Grund für die Neuerfindung des Rads war ganz einfach: Es war so in der Aufgabe vorgegeben und der Assistent hat sich nicht dazu geäußert. Da in einigen Tagen Klausur ist, wollte ich dann doch zeitnah wissen, ob ich zu blöd bin oder der Compiler 🙂
    Da könnt ihr mal sehen, wie dankbar ich euch bin 👍



  • Kenne ich


Anmelden zum Antworten