IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Migration VC6 -> VC8 : Erreur C2248 due à une fonction générée par le compilateur


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut Migration VC6 -> VC8 : Erreur C2248 due à une fonction générée par le compilateur
    Tout d'abord voila le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h(893) : error C2248: 'CObject::CObject' : impossible d'accéder à private membre déclaré(e) dans la classe 'CObject'
            C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h(553) : voir la déclaration de 'CObject::CObject'
            C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h(524) : voir la déclaration de 'CObject'
            Le diagnostic s'est produit dans la fonction 'CException::CException(const CException &)' générée par le compilateur
    Comment se fait-il que le compilateur génère une fonction foireuse ?

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    t'es sur que c'est une erreur due à la migration ?

    quel est la ligne de code qui provoque cette erreur ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    t'es sur que c'est une erreur due à la migration ?
    Uip sûr :
    • Sous VC++6 ça compile sans problemes
    • Sous Visual Studio 2003 ça compile avec tout plein d'erreurs mais rien avoir avec cette erreur.
    • Sous Visual Studio 2005 BOOM !!!


    quel est la ligne de code qui provoque cette erreur ?
    Le problème c'est qu'il n'y a pas de ligne de code spécifique qui provoque cette erreur vu que l'erreur est provoqué par une fonction générée par le compilateur donc je ne peux pas la connaître.
    Disons que j'ai une classe UT_CException qui hérite de CException et une classe UT_CExceptionIA qui hérite de UT_CException :

    CException
    ^
    |
    UT_CException
    ^
    |
    UT_CExceptionIA

    L'erreur se produit dans une classe qui fait des
    Mais ce que je n'arrive pas à comprendre c'est pourquoi le compilateur génère une fonction CException::CException(const CException&) qui est un constructeur par recopie et qui de plus entraine des erreurs à la compilation ??

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Moi je sais lire :
    error C2248: 'CObject::CObject' : impossible d'accéder à private membre déclaré(e) dans la classe
    Donc c'est que tu utilises une classe MFC héritant de CObject ( toutes les classes MFC héritent de CObject).
    Ou bien tu utilises une classe perso héritant de CObject.

    Sinon il faut savoir que depuis VC6 , des classes comme CString ont été modifiées , intégrées avec ATL et définies avec des templates.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Sinon il faut savoir que depuis VC6 , des classes comme CString ont été modifiées , intégrées avec ATL et définies avec des templates
    Oui mais ça n'a rien à voir avec ça...

    Moi je sais lire :
    error C2248: 'CObject::CObject' : impossible d'accéder à private membre déclaré(e) dans la classe
    Donc c'est que tu utilises une classe MFC héritant de CObject ( toutes les classes MFC héritent de CObject).
    Ou bien tu utilises une classe perso héritant de CObject.
    Oui ça aussi je sais lire mais malheureusement le vrai problème vient de la :
    Le diagnostic s'est produit dans la fonction 'CException::CException(const CException &)' générée par le compilateur
    Le probleme c'est que cette fonction générée par le compilateur essaye surement d'accéder à un membre privée de la classe CObject dont elle hérite. Les CException heritent de CObject !
    Donc je vois où est le problème mais je ne vois pas du tout comment le résoudre ? Comment empécher le compilateur de générée cette fonction ?
    J'espère que je ne suis pas le seul à avoir rencontré ce problème lors d'une migration de VC++6 vers VC++8 ??

    Ce problème me rend ...

    Toute aide est la bienvenue et je pense que si on trouve la réponse ça pourrait faire partie du Tuto sur la migration.

    Merci.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je pense qu'il y a un problème de constructeur de copie: Celui de CObject semble être privé, et les CException ne définissent pas leur propre constructeur de copie, tu te retrouves à tenter d'appeler le constructeur privé-->erreur.

    Solution possible: Définir ton propre constructeur de copie pour ta classe qui hérite de CException.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    facile a verifier consulte la definition de la classe en VC6 et celle en VC 2005 ...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Je pense qu'il y a un problème de constructeur de copie: Celui de CObject semble être privé, et les CException ne définissent pas leur propre constructeur de copie, tu te retrouves à tenter d'appeler le constructeur privé-->erreur.

    Solution possible: Définir ton propre constructeur de copie pour ta classe qui hérite de CException.
    Ouep oki c'est ce que je pense aussi mais faut-il que je redéfinisse aussi l'operateur d'affecation ?
    facile a verifier consulte la definition de la classe en VC6 et celle en VC 2005 ...
    Déjà fait, les définitions sont les même c'est le compilateur de VC8 qui est beaucoup plus exigent que le compilateur de VC6. Le compilateur de VC6 laissait finalement une classe héritant de CObject accéder à une méthode privée de CObject, probleme qui a été résolu par le compilateur de VC8 pour mon plus grand malheur...
    Le laxisme des anciennes versions du compilateur c++ de visual entraine plein de probleme pour la migration, si seulement les developpeurs c++ avaient été plus rigoureux sur ce projet ...
    Pas facile de faire une migration

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    dans la classe CException il n'y a pas de constructeur de copie ...
    tu as appelé directement le constructeur de copie de CObjet a partir de ta classe dérivée ?
    si c'est le cas l'erreur ne m'etonne pas trop...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par farscape
    tu as appelé directement le constructeur de copie de CObjet a partir de ta classe dérivée ?
    si c'est le cas l'erreur ne m'etonne pas trop...
    Je répète : ce n'est pas moi qui ai appelé directement le constructeur de copie de CObject mais la fonction générée par le compilateur :
    C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h(893) : error C2248: 'CObject::CObject' : impossible d'accéder à private membre déclaré(e) dans la classe 'CObject'
    C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h(553) : voir la déclaration de 'CObject::CObject'
    C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h(524) : voir la déclaration de 'CObject'
    Le diagnostic s'est produit dans la fonction 'CException::CException(const CException &)' générée par le compilateur
    Je me demande alors si :
    -> Y'a t'il un moyen d'interdire au compilateur de générer cette fonction ?

    -> Faut-il que je redéfinisse le constructeur de copie et l'operateur = dans mes classes dérivées de CException ?

    Je rappelle que je développe sous Visual Studio 2005 et que l'erreur ne se produit pas sous Visual C++ 6 ni sous Visual Studio .NET 2003.

    Est-ce que quelqu'un développant sous VS2005 et ayant réussi à créer des classes héritant de CException peut me dire ce qu'il faut faire ?

    Merci encore pour votre coup de main.

    EDIT : Au fait personne trouve ça bizarre que CException n'ait pas de constructeur par recopie de définit ni l'opérateur d'affectation ?
    C'est pourtant la première chose que j'ai appris à l'ecole...

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    voila:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class CExceptionEx : public CException
    {
    public:
        CExceptionEx():CException(){}
        CExceptionEx(const CExceptionEx &rSrc){}
    };
    ecrit avec visual 2005 ,sans problemes.
    ils ont pas mis de constructeur parce qu'il n'y en avait pas besoin .
    il n'y a qu'une donnée membre de type BOOL...
    le constructeur de copie par defaut étant suffisant .

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par farscape
    ils ont pas mis de constructeur parce qu'il n'y en avait pas besoin .
    il n'y a qu'une donnée membre de type BOOL...
    le constructeur de copie par defaut étant suffisant .
    Ben dans mon cas ça aurait été bien utile vu que le compilateur génére un constructeur par recopie pour CException qui finalement ne marche pas. Un compilateur n'est pas censé planter quelque soit le cas de figure. C'est pas très rigoureux tout ça...

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    néanmoins la reponse doit etre dans ton code ....
    le code que j'ai posté compil sans probleme.
    il faudrait nous montrer la definition de tes classes derivées...

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Je vais modifier les classes qui héritent de CException afin qu'elles redéfinissent le constructeur par recopie. Et voir si ça marche... Si ça passe chez toi, ça devrait passer chez moi
    Merci bien de ton aide !

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Bon je suis content c'est résolu
    Le problème venait du fait que je lançait les exception dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    throw (UT_CException([...])) {
    [...]
    }
    Le problème est corrigée en les lançant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    throw (new UT_CException([...]) [
    [...]
    }
    Il n'y a alors plus appel au constructeur de copie. Le fait de redéfinir le constructeur de copie n'ayant pas résolu le problème c'est la seule solution que j'ai trouvé pour résoudre ce problème. En fouillant dans les FAQ de chez Crosoft c'est aussi la solution qu'il préconisait. Bizarre, bizarre...

    Mais bon ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] "erreur 1004" due à une procédure "autofill"
    Par amauri dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/06/2012, 14h35
  2. Réponses: 3
    Dernier message: 20/02/2009, 17h26
  3. Erreur Mismatch dans une fonction qui rempli une liste déroulante
    Par MisNiak dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/12/2008, 17h11
  4. Erreur aléatoire sur une fonction
    Par defluc dans le forum Firebird
    Réponses: 8
    Dernier message: 10/09/2007, 16h34
  5. erreur syntaxe sur une fonction pow
    Par superyoury dans le forum C
    Réponses: 3
    Dernier message: 10/06/2007, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo