Mögliche Exceptions in Definition - Compiler-Fehler bei Implementierung



  • Mein Problem liegt darin, dass der Compiler alle werfbaren Exceptions als Fehler ankreidet, sobald in der Funktionsdefinition nur ein throw(); auftaucht, obwohl dann doch das Werfen uneingeschränkt möglich wäre.

    z.B.

    #include <string>
    
    using std::string;
    
    class ThrowMe
    {
     public:
         explicit ThrowMe(const string& str) : str_(str) {}
     private:
         string str_;
    };
    
    class ABC
    {
     public:
        void doThrow() 
            throw(); // funzt auch nicht mit "throw(ThrowMe);"
    };
    
    void ABC::doThrow()
    {
        if(true) 
            throw ThrowMe("fehler!"); 
    }
    
    int main()
    {   
        try
        {
            ABC abc;
            abc.doThrow();
        }
        catch(...)
        {
            return -1;
        }
     return 0;
    }
    

    Fehler:

    test.cpp:22: error: declaration of 'void ABC:doThrow()' throws different exceptions 
    test.cpp:18: error: than previous declaration 'void ABC::doThrow() throw()'
    

    Compiler: MinGW-G++ 3.3.1, Mandrake-G++ 3.3.1, Eigenbau G++ 3.4.3
    g++ -fexceptions -o exc_test.xxx test.cpp

    Hoffe ihr könnt mir sagen wo der Fehler liegt.

    mfg



  • Die Exception-Spezifikation muss bei Deklaration und Definition übereinstimmen.

    Allerdings glaub ich, du hast was grundlegend missverstanden: throw() bedeutet, dass KEINE Exceptions ausgeworfen werden können. Der Sinn von Exception-Spezifikationen hält sich ansonsten ziemlich in Grenzen, du vergibst dir nichts, wenn du darauf verzichtest.



  • throw heißt doch, dass keine Exceptions geworfen werden können?

    /Edit: Pressed the Bashar too l8.

    MfG SideWinder



  • Aber:

    class ABC
    {
     public:
        void doThrow() throw(ThrowMe)
        {
            throw ThroeMe("blubba");
        }
    };
    

    Sollte doch eigentlich schon funktionieren?

    MfG SideWinder



  • Bashar schrieb:

    throw() bedeutet, dass KEINE Exceptions ausgeworfen werden können.

    Gut zu wissen. Fehler von mir.

    SideWinder schrieb:

    Aber:

    class ABC
    {
     public:
        void doThrow() throw(ThrowMe)
        {
            throw ThrowMe("blubba");
        }
    };
    

    Sollte doch eigentlich schon funktionieren?

    Ja, inline funzt es, sonst nicht. Habe ich da noch etwas übersehen? 😕

    mfg



  • Eventuell musst du es bei der Definition auch in den Funktionskopf schreiben?!

    MfG SideWinder



  • terraner schrieb:

    Habe ich da noch etwas übersehen? 😕

    Den ersten Satz meines Postings.



  • Bashar schrieb:

    terraner schrieb:

    Habe ich da noch etwas übersehen? 😕

    Den ersten Satz meines Postings.

    Du schreibst zu unauffällig, ich habs auch überlesen 🙄

    MfG SideWinder



  • Bashar schrieb:

    Den ersten Satz meines Postings.

    hm... hey, du hast recht!

    Danke Bashar und SideWinder!

    mfg


Anmelden zum Antworten