Fehler mit templates und qt



  • Hallo zusammen,
    ich hab mal wieder ein Problem mit templates:

    Habe mir ein kleines signal/slot-template geschrieben.
    Unter normalen Umständen funktioniert das Ganze prima.
    Nun habe ich die Klasse aber in ein qt-Projekt eingebunden und bekomme haufenweise Fehlermeldungen. 😕
    Ich bin bei diesen vielsagenden Fehlermeldungen mit meinem template-Latain am Ende.
    Sieht jemand, ob ich bei der Definition groben Unfug gebaut habe?

    Ich bekomme folgende Fehlermeldungen (Ausschnitt)
    1>main.cpp
    1>MainWindow.cpp
    1>d:\prog\projects\qt_sim_skeleton\qt_sim_skeleton\signal_slot.h(28) : error C2146: syntax error : missing ')' before identifier 't'
    1> d:\prog\projects\qt_sim_skeleton\qt_sim_skeleton\signal_slot.h(43) : see reference to class template instantiation 'sigslots::t_signal<T>' being compiled
    1>d:\prog\projects\qt_sim_skeleton\qt_sim_skeleton\signal_slot.h(28) : error C2146: syntax error : missing ';' before identifier 't'
    1>d:\prog\projects\qt_sim_skeleton\qt_sim_skeleton\signal_slot.h(28) : error C2182: 'T' : illegal use of type 'void'
    1>d:\prog\projects\qt_sim_skeleton\qt_sim_skeleton\signal_slot.h(28) : error C2059: syntax error : ')'
    1>d:\prog\projects\qt_sim_skeleton\qt_sim_skeleton\signal_slot.h(29) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

    [cpp]
    #ifndef SIGNAL_SLOT_H
    #define SIGNAL_SLOT_H
    
    #include <set>
    
    namespace sigslots {
    
    // WARNING: mutex all methods for thread-safety
    
    // forward declaration
    template <class T>
    class t_slot;
    
    template <class T>
    class t_signal {
    	friend class t_slot<T>;
    public:
    	~t_signal()
    	{
    		for (slot_list::iterator iter = slots.begin();
    			iter!=slots.end();
    			++iter)
    		{
    			(*iter)->signals.erase(this);
    		}
    	}
    
    	void emit(T t)
    	{
    		for (slot_list::iterator iter = slots.begin();
    			iter!=slots.end();)
    		{
    			slot_list::iterator next = iter;
    			next++;
    			(*iter)->update(t, this);
    			iter = next;
    		}
    	}
    
    protected:
    	typedef std::set< t_slot<T>* > slot_list;
    	slot_list slots;
    };
    
    template <class T>
    class t_slot {
    	friend class t_signal<T>;
    public:
    	~t_slot()
    	{
    		for (signal_list::iterator iter = signals.begin();
    			iter!=signals.end();
    			++iter)
    		{
    			(*iter)->slots.erase(this);
    		}
    	}
    
    	void bind(t_signal<T>* signal)
    	{
    		signal->slots.insert(this);
    		signals.insert(signal);
    	}
    	void unbind(t_signal<T>* signal)
    	{
    		signal->slots.erase(this);
    		signals.erase(signal);
    	}
    	virtual void update(T param, t_signal<T>* signal) = 0;
    
    protected:
    	typedef std::set< t_signal<T>* > signal_list;
    	signal_list signals;
    };
    
    }
    
    #endif  // SIGNAL_SLOT_H
    [/cpp]
    


  • T Unicode Zeichen, wech damit.



  • ?
    Ne, am T liegt's nicht.
    z.B. mit type gibt's die gleichen Fehler



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • post die datei mal 1:1 oder berichtige auch die fehlermeldungen...



  • slots emit signals SIGNAL und SLOT sind in der QT Bibliothek Makros. Die werden für die QT eigenen Signals und Slots verwendet. Wenn Du also irgendo darüber einen QT-Header einbindest, werden die Makros Deinen Code zerstören.

    Dietrich



  • ok, vielen Dank für die Antwort!
    Verdammte qt Makros, da helfen nicht mal Namensräume 😞



  • Es hilft aber, seine eigenen Bezeichner spezifischer zu wählen. 😉


Anmelden zum Antworten