none
Les exceptions ne compilent plus RRS feed

  • Question

  • Bonjour

    J'ai des méthodes pour traiter des exceptions, mais elles ne compilent plus

    //---------------------------------------------------------------------------
    
    
    #pragma hdrstop
    using namespace std;
    #include "StdAfx.h"
    #include "Exception.h"
    #include <iostream>
    #include <strstream>
    #include <sstream>
    
    //---------------------------------------------------------------------------
    
    //#pragma package(smart_init)
    /*---------------------------------------------------------------*/
    /*                CLASS EXCEPTION                                */
    /*---------------------------------------------------------------*/
    
    Doc_exception::Doc_exception( const char * Msg, int Line )
    {
            std::ostringstream oss;
            oss << Msg << ": Erreur paragraph " << Line << " : ";
            this->msg = oss.str();
    }
    
    Doc_exception::~Doc_exception() throw()
    {
    
    }
    
    const char * Doc_exception::what() const throw()
    {
            return this->msg.c_str();
    }
    
    BlockingException::BlockingException( const char * Msg, int Line )
    {
            std::ostringstream oss;
            oss << Msg << ": Erreur paragraph " << Line << " : ";
            this->msg = oss.str();
    }
    
    BlockingException::~BlockingException() throw()
    {
    
    }
    
    const char * BlockingException::what() const throw()
    {
            return this->msg.c_str();
    }
    

    Je vous met le haeder:

    //---------------------------------------------------------------------------
    
    #ifndef ExceptionH
    #define ExceptionH
    
    //---------------------------------------------------------------------------
    ref class Doc_exception : public std::exception
    {
    public:
        Doc_exception::Doc_exception( const char * Msg, int Line );
        Doc_exception::~Doc_exception() throw();
        const char * Doc_exception::what() const throw();
    private:
        std::string msg;
    };
    
    ref class BlockingException : public std::exception
    {
    public:
       BlockingException::BlockingException( const char * Msg, int Line );
       BlockingException::~BlockingException()  throw();
       const char * BlockingException::what() const throw();
    private:
        std::string msg;
    };
    
    
    #endif

    et les messages d'erreur:

    1>  Exception.cpp
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(6): error C2039: 'exception' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(6): error C2504: 'exception' : classe de base non définie
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C2039: 'string' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'msg'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(16): error C2039: 'exception' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(16): error C2504: 'exception' : classe de base non définie
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C2039: 'string' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'msg'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>..\..\..\..\Common\src\Exception.cpp(23): error C2039: 'msg' : n'est pas membre de 'Doc_exception'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(5) : voir la déclaration de 'Doc_exception'
    1>..\..\..\..\Common\src\Exception.cpp(33): error C2039: 'msg' : n'est pas membre de 'Doc_exception'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(5) : voir la déclaration de 'Doc_exception'
    1>..\..\..\..\Common\src\Exception.cpp(33): error C2228: la partie gauche de '.c_str' doit avoir un class/struct/union
    1>..\..\..\..\Common\src\Exception.cpp(40): error C2039: 'msg' : n'est pas membre de 'BlockingException'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(15) : voir la déclaration de 'BlockingException'
    1>..\..\..\..\Common\src\Exception.cpp(50): error C2039: 'msg' : n'est pas membre de 'BlockingException'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(15) : voir la déclaration de 'BlockingException'
    1>..\..\..\..\Common\src\Exception.cpp(50): error C2228: la partie gauche de '.c_str' doit avoir un class/struct/union
    1>

    Je suis démuni devant ces diagnostiques.

    Qui pourra m'orienter?


    Jean Noël Martin

    mercredi 4 février 2015 09:49

Réponses

  • Il est chaudement recommandé de toujours mettre les includes systèmes avant les includes de librairie tierces et de mettre les includes spécifiques au projet en dernier.

    Pour le confort d'utilisation de VS, il est recommandé de mettre les fichiers d'en-tête commun à l'ensemble des modules du projet, comme <exception> et <string> dans le "StdAfx.h".

    De plus, votre problème, c'est que votre fichier Exception.h n'est pas cohérent, c'est à lui d'inclure <exception> et <string> et pas au fichier cpp. Il faut être en mesure de n'inclure que Exception.h dans un fichier de code source utilisateur de ces classes.

    Comme d'habitude, je vous recommande de sérieusement réviser les notions de base du C++, vous galérez car vous n'avez pas les bases essentielles.


    Paul Bacelar, Ex - MVP VC++

    • Proposé comme réponse Boris Ivanov mercredi 25 février 2015 08:26
    • Marqué comme réponse JeanNoel53 mercredi 25 février 2015 11:23
    lundi 9 février 2015 09:45
    Modérateur

Toutes les réponses

  • Vous mélangez toujours code natif et code managé.

    Pas de "ref" devant le mot clé "class" quand on déclare une classe native. std::exception est une classe native, vos 2 classes sont donc des classes natives.

    http://www.cplusplus.com/reference/exception/exception/

    Comme indiquer dans l'exemple de la documentation, il faut faire un include du header de la class exception :

    #include <exception>


    Paul Bacelar, Ex - MVP VC++


    mercredi 4 février 2015 14:24
    Modérateur
  • même quand je fait ce que vous recommandez les messages sont les mêmes

    Jean Noël Martin

    mercredi 4 février 2015 21:10
  • J'ai pris votre code, j'ai supprimé les "ref" et ajouter ces 2 ligne après le "#define ExceptionH"

    #include <exception>
    #include <string>

    Et cela compile dans nouveau projet C++/CLI.

    Le problème est ailleurs, donnez ces putains de messages d'erreurs.


    Paul Bacelar, Ex - MVP VC++

    jeudi 5 février 2015 11:34
    Modérateur
  • J'ai fait ce que vous avez dit et j'ai une flopée de messages d'erreur:

    1>  Exception.cpp
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(6): error C2039: 'exception' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(6): error C2504: 'exception' : classe de base non définie
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C2039: 'string' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'msg'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(12): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(16): error C2039: 'exception' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(16): error C2504: 'exception' : classe de base non définie
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C2039: 'string' : n'est pas membre de 'std'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'msg'
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>D:\usr\Specification Loader\dev\Common\com\Exception.h(22): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    1>..\..\..\..\Common\src\Exception.cpp(25): error C2039: 'msg' : n'est pas membre de 'Doc_exception'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(5) : voir la déclaration de 'Doc_exception'
    1>..\..\..\..\Common\src\Exception.cpp(35): error C2039: 'msg' : n'est pas membre de 'Doc_exception'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(5) : voir la déclaration de 'Doc_exception'
    1>..\..\..\..\Common\src\Exception.cpp(35): error C2228: la partie gauche de '.c_str' doit avoir un class/struct/union
    1>..\..\..\..\Common\src\Exception.cpp(42): error C2039: 'msg' : n'est pas membre de 'BlockingException'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(15) : voir la déclaration de 'BlockingException'
    1>..\..\..\..\Common\src\Exception.cpp(52): error C2039: 'msg' : n'est pas membre de 'BlockingException'
    1>          D:\usr\Specification Loader\dev\Common\com\Exception.h(15) : voir la déclaration de 'BlockingException'
    1>..\..\..\..\Common\src\Exception.cpp(52): error C2228: la partie gauche de '.c_str' doit avoir un class/struct/union
    1>
    mais j'ai changé les ordres des includes et avec cet ordre, ça compile
    #include "StdAfx.h"
    #include <exception>
    #include <string>
    #include "Exception.h"
    #include <iostream>
    #include <strstream>
    #include <sstream>


    Jean Noël Martin

    jeudi 5 février 2015 19:19
  • Il est chaudement recommandé de toujours mettre les includes systèmes avant les includes de librairie tierces et de mettre les includes spécifiques au projet en dernier.

    Pour le confort d'utilisation de VS, il est recommandé de mettre les fichiers d'en-tête commun à l'ensemble des modules du projet, comme <exception> et <string> dans le "StdAfx.h".

    De plus, votre problème, c'est que votre fichier Exception.h n'est pas cohérent, c'est à lui d'inclure <exception> et <string> et pas au fichier cpp. Il faut être en mesure de n'inclure que Exception.h dans un fichier de code source utilisateur de ces classes.

    Comme d'habitude, je vous recommande de sérieusement réviser les notions de base du C++, vous galérez car vous n'avez pas les bases essentielles.


    Paul Bacelar, Ex - MVP VC++

    • Proposé comme réponse Boris Ivanov mercredi 25 février 2015 08:26
    • Marqué comme réponse JeanNoel53 mercredi 25 février 2015 11:23
    lundi 9 février 2015 09:45
    Modérateur