Zeitmessung multiple definitions of operator



  • Hallo Leute,

    ich brauche eine Zeitmessung, um die Dauer von Funktionen testen zu können.

    Dazu benutze ich das hier:
    https://www.c-plusplus.net/forum/220704-full

    Zu meinem Problem habe ich das hier gefunden:
    http://stackoverflow.com/questions/12802536/c-multiple-definitions-of-operator

    Das hat mir aber nicht weitergeholfen.

    Ich habe wie im Thread beschrieben, die operator Funktion ausgelagert in eine extra .cpp, aber jetzt bekomme ich folgendes:

    timer.cpp:8:65: error: 'std::ostream& timer::operator<<(std::ostream&, const timer&)' must take exactly one argument
    

    hier noch meine Funktionen:

    timer.h

    #ifndef TIMER_H
    #define TIMER_H
    
    /* includes */
    #include <iostream>
    #include <string>
    #include <ctime>
    
    class timer
    {
        struct timespec ts_start, ts_end;
        clockid_t id;
        public:
        timer(clockid_t clock = CLOCK_MONOTONIC) { id = clock; }
    
        void start() { clock_gettime(id, &ts_start); }
        void stop()  { clock_gettime(id, &ts_end);   }
    
        friend std::ostream & operator<<(std::ostream& os, const timer &t);
    };
    
    #endif /* 	TIMER_H */
    

    timer.cpp

    #include "timer.h"
    
    /* includes */
    #include <iostream>
    #include <string>
    #include <ctime>
    
    std::ostream& timer::operator<<(std::ostream& os, const timer &t)
    {
        unsigned long ns = (t.ts_end.tv_sec - t.ts_start.tv_sec) * 1000000000 + t.ts_end.tv_nsec - t.ts_start.tv_nsec;
        std::string ext = "ns";
    
        if (ns >= 10000) {
            ns /= 1000;
            ext = "us";
        }
    
        if (ns >= 10000) {
            ns /= 1000;
            ext = "ms";
        }
    
        if (ns >= 10000) {
            ns /= 1000;
            ext = "s";
        }
    
        os << ns << " " << ext;
    
        return os;
    }
    

    ich hoffe ich habe mich verständlich ausgedrückt und ihr könnt mir helfen 🙂



  • EDIT:

    ich sollte vielleicht erwähnen, dass ich es zuerst auf einem Windows Rechner getestet habe, wo es super funktionierte.

    Da ich es aber auf einer Linux-Hardware brauche, hab ich es jetzt auf einer Ubuntu VM getestet und da trat jetzt der Fehler auf 🙂



  • struct gadget{
      friend std::ostream& operator<<(std::ostream&, const gadget&);
    };
    
    // nicht gut: als Memberfunktion
    //std::ostream& gadget::operator<<(std::ostream& out, const gadget& g){ return out; }
    
    //gut: als freie Funktion
    std::ostream& operator<<(std::ostream& out, const gadget& g){ return out; }
    


  • Hallo,

    danke für den Tipp 🙂

    Hab ja nur copy paste gemacht.

    Problem ist nur, dass egal, ob ich's als freidn, inline oder freie mache, dieser Fehler auftritt .... er aktzeptiert nur ein Argument 😞



  • Bin_Unregistriert schrieb:

    Hallo,

    danke für den Tipp 🙂

    Hab ja nur copy paste gemacht.

    Problem ist nur, dass egal, ob ich's als freidn, inline oder freie mache, dieser Fehler auftritt .... er aktzeptiert nur ein Argument 😞

    Du siehst aber schon einen Unterschied zwischen den Zeilen 6 und 9 in meinem Beispiel? (Und ich meine nicht die // am Anfang.)



  • Hallo,

    oh, hab ich komplett übersehen 🙄
    Entschuldige 🙂

    Hab es gleich getestet und es funktioniert 👍

    Vielen Dank 😃 😃 😃


Log in to reply