lästige Fehler in xmemory



  • Um genau zu sein wird dieser eine Fehler von Queueush verursacht. Ich denke mal wegen dem Parameter, weis es aber nicht, denn ich kenn mich mit Funktionspointern nicht wirklich aus.

    thx



  • Hast du operator new irgendwo überladen?

    Zudem:

    void* Queuepop(){return Messagequeue.back();}
    

    sollte eher heißen:

    void (*) () Queuepop(){return Messagequeue.back();}
    

    Folgendes macht irgendwie keinen Sinn:

    virtual void CheckQueue()
            {
                if(!Messagequeue.empty())
                {
                    while(!Messagequeue.empty())
                    {
                        *(Messagequeue.back());                        
                    }
                }
            }
    

    Wenn Funktionen die deine Queue enthält, aufgerufen werden sollen, dann:

    virtual void CheckQueue()
    {
        while (!Messagequeue.empty()) {
            Messagequeue.front()();
            Messagequeue.pop();
        }
    }
    


  • Danke, habs geändert, aber VC++ erkennt es nicht an, folgende Fehler treten auf:

    void (*) () Queuepop(){return Messagequeue.back();} 
    /*
    Syntaxfehler : ')'
    Unerwartete(s) Token vor '{'; sichtbarer Funktionsrumpf wird übersprungen
    */
    

    Das zweite ist sicher ein Folgefehler



  • Direkt nach dem * muss auch das kommen, was eben ein Zeiger auf eine Funktion sein soll. Also eher

    void (*deineFunktion())()
    

    oder so ähnlich. Wie wäre es einfach mal mit einem typedef?



  • wie wärs gleich mit nem template?



  • Was soll ich statt "deineFunktion" einfügen? Die Funktion wird ja benutzt, um eine beliebige Funktion, die void zurückgibt und keine Parameter erhält, aus der Liste ausliest und zurückgibt (ich weis, dass sie das hier nicht tut, aber ich habs bei mir so geändert:

    void (*) () Queuepop(){void (*) () temp = Messagequeue.back(); Messagequeue.pop(); return temp;}
    

    ).

    thx
    Glamdring



  • Wie wärs damit:

    typedef std::queue<void (*) ()> Messages;
    Messages Messagequeue;
    
    //...
    
    Messages::value_type Queuepop()
    {
    	Messages::value_type p = Messagequeue.back();
    	Messagequeue.pop();
    
    	return p;
    }
    


  • a) das klappt so nicht.
    b) es klappt aber mit functors
    c)

    Messages::value_type Queuepop()
    {
        Messages::value_type p = Messagequeue.back();
        Messagequeue.pop();
    
        return p;
    }
    

    nie back und pop bzw top und pop in eine funktion packen, das gibt probleme mit exceptions(is auch der grund, weshalb die stl container dies nicht machen)
    d) functoren hab ich dir erst letztens ans herz gelegt
    e) falls du dir die arbeit mit den functors nicht machen willst, dann leg ich dir noch das an herz:

    void foo(){
        cout<<"blub";
    }
    typedef void (*pointer)();
    pointer test(){
        return foo;
    }
    

    //edit mir fiel nochn f ein:
    f) wärs nich besser die funktion nicht zurückzugeben, sondern direkt auszuführen?´
    also:

    void queueTop(){
        messageQueue.back()();     
    }
    


  • otze schrieb:

    a) das klappt so nicht.

    Was klappt nicht?

    b) es klappt aber mit functors

    Er verwendet lieber statische Funktionen...

    nie back und pop bzw top und pop in eine funktion packen, das gibt probleme mit exceptions(is auch der grund, weshalb die stl container dies nicht machen)

    Er implementiert aber keine STL Container, deshalb ist der Code in Ordnung. Ich wüßte auch nicht welche Probleme es mit Exceptions geben sollte...



  • tritt beim letzte kopieren(also bei der wertrückgabe) eine exception auf, ist das objekt im container bereits gelöscht, und damit verloren.
    klar, in diesem fall ist es relativ unwahrscheinlich, dass ne exception auftritt, aber das sollte man bei solchen konstruktionen immer beachten(vorallem bei meinem vorschlag mit dem functor).
    btw irgendwann hat er mal in nem andren zusammenhang erwähnt, dass er auch methoden in soeiner konstruktion speichern will,spätestens dann brauch er nen funktor



  • Glamdrink schrieb:

    Was soll ich statt "deineFunktion" einfügen?

    Queuepop.

    void (*) () Queuepop(){void (*) () temp = Messagequeue.back(); ...
    

    Du solltest dir mal die Deklarationssyntax genauer ansehen. In C++ gilt nicht "was links steht, ist der Typ", sondern ein stark verkrüppeltes "declaration looks like use" (oder so). Genauso wie eine int zurückgebende Funktion nicht mit "int() foo" sondern mit "int foo()" deklariert wird, deklariert man einen Zeiger foo auf eine solche Funktion mit "int (*foo)()". Und wenn du jetzt noch typedef davor schreibst und int durch void ersetzt, hast du dir diese Ekelsyntax für den Rest deiner Klasse erspart 🙂 Die ist eigentlich noch ein Grund mehr, konsequent boost::function zu verwenden...



  • Das stell ich nochmal zurück, denn ich habe festgestellt, woher die beiden anderen Fehler kommen, dazu musste ich alles kommentieren. Da die Basisklasse die Fehler erzeugt muss ich diese zuerst bereinigen.
    Hier kommen zwei Fehler vor:

    template <> class DLL Base<true>
    	{
    	protected:
    	    virtual inline void del(){}
    	private:
    	    inline ~Base(){}
    	public:
    	    Base(){}
    	    virtual void destroy(){del(); delete this;}
    	    friend void* operator new(size_t); //Hier sind die beiden Fehler 
    	    friend void  operator delete(void*, size_t);
    	};
    

    Was ist daran falsch?

    mfg
    Die Fehler:

    d:\altdaten c\programme\microsoft visual studio\vc98\include\xmemory(30) : error C2668: 'new' : Mehrdeutiger Aufruf einer ueberladenen Funktion
    d:\altdaten c\programme\microsoft visual studio\vc98\include\xmemory(59) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'unsigned int *__cdecl std::_Allocate(int,unsigned int *)'
    d:\altdaten c\programme\microsoft visual studio\vc98\include\xmemory(30) : error C2668: 'new' : Mehrdeutiger Aufruf einer ueberladenen Funktion
    d:\altdaten c\programme\microsoft visual studio\vc98\include\xmemory(59) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'char *__cdecl std::_Allocate(int,char *)'

    Ich hab keine Ahnung, was das heist!



  • was is der sinn davon, dass new friend der klasse ist?



  • Fällt mir auch grad auf, ich dachte, dass wäre vonnöten, damit die Instanzen der Klasse nur mit new erzeugbar zu machen. Habs weg gemacht, die Fehler sind weg, aber alles geht noch. aua 🙄



  • und ein weiterer zufriedener Kunde 🤡


Anmelden zum Antworten