Frage zu einer Warnung


  • Mod

    kimmi schrieb:

    Vielleicht die Tatsache, daß man Templates in der Regel als inline definiert?

    Wie kommst du denn darauf?

    #include <iostream>
    
    template <typename T> class test{
    private:
      T t;
    public:
      test(const T& tt): t(tt){}
      void show();
    };
    
    template<typename T> void test<T>::show(){ // Nicht inline
      for (int i=0; i<100; i++){
        std::cout<<t<<std::endl;
      }
    }
    
    int main(){
      test<double> my_test(5.);
      my_test.show();
    }
    

    Wenn man versteht(!), was eine Warnung soll, ist es auch kein Problem sie zu ignorieren.



  • SeppJ schrieb:

    Wenn man versteht(!), was eine Warnung soll, ist es auch kein Problem sie zu ignorieren.

    Und erst recht nicht, sie abzuschalten - entweder durch (compilerspezifische) #pragmas oder (besser) indem man die Ursache behebt. Warnungsfrei zu compilieren hat nämlich diverse Vorteile, z.B. übersieht man nciht zwischen den 500 Warnungen, die man verstanden (!) und ignoriert hat die eine Warnung, die auf einen tatsächlichen Fehler hinweist.



  • Bist du da sicher? In deinem Beispiel benutzt du zwar nicht das Statement inline, aber das Template wird während des Compiles als Schablone benutzt, um den gewünschten Code zu generieren. Von da aus mussten die Template-Implementierungen immer geinlined vorliegen ( also im Header beispielsweise oder wie bei dir direkt mit Implementierung im Source-File).
    Oder liege ich da falsch?

    Bezüglich dem Ignorieren von Warnings: Volle Zustimmung! Und wenn man sie per Pragma abschaltet: am besten so lokal wie möglich.

    Gruß Kimmi



  • kimmi schrieb:

    Bist du da sicher? In deinem Beispiel benutzt du zwar nicht das Statement inline, aber das Template wird während des Compiles als Schablone benutzt, um den gewünschten Code zu generieren. Von da aus mussten die Template-Implementierungen immer geinlined vorliegen ( also im Header beispielsweise oder wie bei dir direkt mit Implementierung im Source-File).
    Oder liege ich da falsch?

    Ja, völlig falsch. Zum Einen haben Templates keine Sourcen, weil die kompletten definitionen immer mit #included werden müssen. Zum Anderen müssen Template-Implementierungen anders als bei normalen Klassen nicht geinlined werden, obwohl sie mit im Header stehen. Das hat zwar zur Folge, dass z.B. eine Methode Foo<int>::bar in mehreren Übersetzungseinheiten vorliegen kann, das darf den Linker allerdings nicht stören, er nimmt dann einfach irgendeine davon. Allerdings muss sichergestellt sein, dass sie gleichwertig sind, d.h. aus einer Definition stammen (die sog. One Definition Rule).



  • Ok, danke für die Info!

    Gruß Kimmi



  • Hallo,
    vielen Dank für eure Antworten. Ich wusste nicht, dass wenn man die Methoden eines Templates direkt definiert, dass sie dann inline sind. Da ich auch der Meinung bin, auf die Warnungen einzugehen, frage ich mich, was ich nun tun soll? Soll ich alle Methoden umständlich eigens definieren oder was würdet ihr machen?

    Vielen Dank
    lg, freakC++


  • Mod

    Viele Compiler besitzen #pragma Direktiven, um Warnungen an bestimmten Stellen gezielt auszuschalten. Wie das geht, steht in der Anleitung deines Compilers oder, wenn es ein gängiger Compiler ist, kann sicherlich auch hier jemand erklären wie das geht.



  • freakC++ schrieb:

    Ich wusste nicht, dass wenn man die Methoden eines Templates direkt definiert, dass sie dann inline sind.

    Grundsätzlich sind alle Methoden, die in der Klassendefinition gleich mitdefiniert werden, implizit inline deklariert. Egal ob es dabei um Methoden von normalen Klassen oder von Klassentemplates geht.



  • freakC++ schrieb:

    Ich wusste nicht, dass wenn man die Methoden eines Templates direkt definiert, dass sie dann inline sind.

    Das ist unglücklich ausgedrückt. Definitionen von Elementfunktionen, die innerhalb der Klassendefinition stehen, sind automatisch "inline". Mit Templates hat das nichts zu tun.

    class A
     {
      public:
       void ich_bin_inline() {} 
       void ich_nicht();
     };
    
     void::ich_nicht() {}
    

    freakC++ schrieb:

    Da ich auch der Meinung bin, auf die Warnungen einzugehen, frage ich mich, was ich nun tun soll?

    Das musst Du wissen ... Man sollte sich jedenfalls im Klaren darüber sein, was inline bedeutet und wann Funktionen implizit inline sind. Ich würde wahrscheinlich diese Warnung ignorieren und ausschalten. Der G++ Compiler nervt mich mit so einer Warnung beispielsweise nicht.

    Gruß,
    SP



  • Dann ist mir jetzt auch klar, wo mein Trugschluß diesbezüglich lag.

    Gruß Kimmi



  • Ok,
    vielen Dank. Ich werde die Warnung abschalten.

    bis bald
    lg, freakC++


Anmelden zum Antworten