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

Visual C++ Discussion :

struct type redefinition avec VS 2005


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut struct type redefinition avec VS 2005
    Bonjour,

    J'essaye de compiler mon projet avec VS 2005. Malheuresement, VS 2005 n'aime pas mon projet (plutot j'ai fait une connerie) .

    L'erreur :
    error C2011: 'IFont' : 'struct' type redefinition

    Si j'ai bien compris qu'il y a 2 definition de mon class (ou struct) IFont, mais je n'arrive pas a comprendre d'ou vient la deuxieme definition et comment la resoudre ,surtout que mon projet etais developper avec VS 2003 est ca compilé tres bien ( NO ERRORS AVEC VS 2003).

    Voici le fichier source de l'erreur :

    1. header file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #pragma once
    #include <afxwin.h> // MFC core and standard components
    #include <afxtempl.h>
     
     
    	class IFont
    	{
    	public:
     
    		/*IFont(const char*, const char*, const char*);
    		IFont(const char*, const char*, int);*/
    		IFont();
    		~IFont();
    		float Height();
    		float Baseline();
    		float Width(const char* s, int length);
    		void Extents(const char* s,int i, Text_Extent* e);
    	};
     
     
    template <class T>
    	class MapIPaint {
     
    	protected:
    		// void Init(const char*);
    		// void DefineEntries(const char*);
    		// void DefineInitial(const char*);
    		// T* CreateEntry(const char*);
     
    		int initial;		// denotes which entry is used on startup
    		CArray<T*> m_ptArray;
    		int m_current;
     
    	public:
    		T* FindOrAppend(const CString& str);
    		T* FindOrAppend(unsigned char r, unsigned char g, unsigned char b);
    		T* FindOrAppend(bool none, int p, float w, int l, int r, int z=false);
    		INT_PTR Size() const;
    		bool AtEnd();
    		T* First();
    		T* Last();
    		T* Prev();
    		T* Next();
    		int GetCurrentIndex();
    		T* GetCur();
    		T* Index(int index) const;
    		int Find(const T* obj) const;
    		void setInitial(int i);
    		T* GetInitial();
    	};
    2. cpp file
    [
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #include <stdio.h>
    #include "mapipaint.h"
     
    /////////////////////// IFont ///////////////////////
    // j'ai pas donné l'implementation ,parceque je suis certains que ca ne vient pas d'ici
     
    IFont::IFont() {} 
    IFont::~IFont() {}
    float IFont::Height() {
    	return 0.0;
    }
    float IFont::Baseline() {
    	return 0.0;
    }
    float IFont::Width(const char* s, int length) {
    	return 0.0;
    }
     
    void IFont::Extents(const char* s , int i , Text_Extent* e) {}
     
    // bien sur ici il y a la definition de class template

    Comme je l'avais dis , il compile bien avec VS 2003.

    quelqu'un aurra une idée ?

    Merci en avance

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Essayer d'utiliser les garde d'inclusions : #ifndef, #define, #endif tel que dans :
    http://c.developpez.com/faq/cpp/inde...ASS_header_cpp

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Alp
    Essayer d'utiliser les garde d'inclusions : #ifndef, #define, #endif tel que dans :
    http://c.developpez.com/faq/cpp/inde...ASS_header_cpp
    En fait je crois que le probleme vient de ces deux includes :
    #include <afxwin.h> // MFC core and standard components
    #include <afxtempl.h>

    et puis comme je l'avais dis , ca compile avec VS 2003 donc ce n'est pas un probleme d'inclusion multiple des fichiers header. Mais il y a vraiment une nouveaute dont la class IFont !!

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    il est clair qu'il faut toujours mettre des #ifdef....

    ca devient donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #ifndef __CLASS_IFRONT__
    #define __CLASS_IFRONT__
    #include <afxwin.h> // MFC core and standard components
    #include <afxtempl.h>
     
     
    	class IFont
    	{
    	public:
     
    		/*IFont(const char*, const char*, const char*);
    		IFont(const char*, const char*, int);*/
    		IFont();
    		~IFont();
    		float Height();
    		float Baseline();
    		float Width(const char* s, int length);
    		void Extents(const char* s,int i, Text_Extent* e);
    	};
     
     
    template <class T>
    	class MapIPaint {
     
    	protected:
    		// void Init(const char*);
    		// void DefineEntries(const char*);
    		// void DefineInitial(const char*);
    		// T* CreateEntry(const char*);
     
    		int initial;		// denotes which entry is used on startup
    		CArray<T*> m_ptArray;
    		int m_current;
     
    	public:
    		T* FindOrAppend(const CString& str);
    		T* FindOrAppend(unsigned char r, unsigned char g, unsigned char b);
    		T* FindOrAppend(bool none, int p, float w, int l, int r, int z=false);
    		INT_PTR Size() const;
    		bool AtEnd();
    		T* First();
    		T* Last();
    		T* Prev();
    		T* Next();
    		int GetCurrentIndex();
    		T* GetCur();
    		T* Index(int index) const;
    		int Find(const T* obj) const;
    		void setInitial(int i);
    		T* GetInitial();
    	};
     #endif
    Pour ce qui est de la class IFont, verifie dans tes headers qu'il ne manque pas une directive de compilation dans le meme principe #ifdef... mais normalement l'ensemble de ces fichiers utilisent cette logique...

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut
    Citation Envoyé par rikau2
    il est clair qu'il faut toujours mettre des #ifdef....

    ca devient donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #ifndef __CLASS_IFRONT__
    #define __CLASS_IFRONT__
    #pragma once
    #include <afxwin.h> // MFC core and standard components
    #include <afxtempl.h>
     
     
    	class IFont
    	{
    	public:
     
    		/*IFont(const char*, const char*, const char*);
    		IFont(const char*, const char*, int);*/
    		IFont();
    		~IFont();
    		float Height();
    		float Baseline();
    		float Width(const char* s, int length);
    		void Extents(const char* s,int i, Text_Extent* e);
    	};
     
     
    template <class T>
    	class MapIPaint {
     
    	protected:
    		// void Init(const char*);
    		// void DefineEntries(const char*);
    		// void DefineInitial(const char*);
    		// T* CreateEntry(const char*);
     
    		int initial;		// denotes which entry is used on startup
    		CArray<T*> m_ptArray;
    		int m_current;
     
    	public:
    		T* FindOrAppend(const CString& str);
    		T* FindOrAppend(unsigned char r, unsigned char g, unsigned char b);
    		T* FindOrAppend(bool none, int p, float w, int l, int r, int z=false);
    		INT_PTR Size() const;
    		bool AtEnd();
    		T* First();
    		T* Last();
    		T* Prev();
    		T* Next();
    		int GetCurrentIndex();
    		T* GetCur();
    		T* Index(int index) const;
    		int Find(const T* obj) const;
    		void setInitial(int i);
    		T* GetInitial();
    	};
     #endif
    Pour ce qui est de la class IFont, verifie dans tes headers qu'il ne manque pas une directive de compilation dans le meme principe #ifdef... mais normalement l'ensemble de ces fichiers utilisent cette logique...
    Quand on utilise ca suffirra pour eviter les problemes d'inclusion

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    De plus #pragma once n'est pas du tout standard et ne marche pas sur un bon nombre de compilateurs.

    Les gardes d'inclusions (#ifndef & compagnie) marchent à tous les coups, eux.

    Tu es sur que ce n'est pas ça la cause de ton problème de compilation ?
    Desfois que VS2003 ait des habitudes bizarres ...

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut
    Citation Envoyé par Alp
    De plus #pragma once n'est pas du tout standard et ne marche pas sur un bon nombre de compilateurs.

    Les gardes d'inclusions (#ifndef & compagnie) marchent à tous les coups, eux.

    Tu es sur que ce n'est pas ça la cause de ton problème de compilation ?
    Desfois que VS2003 ait des habitudes bizarres ...
    Je suis sur que ce n'est pas un probleme d'inclusion.

    En fait , vu que j'inclus les deux fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <afxwin.h> // MFC core and standard components
    #include <afxtempl.h>
    il y a inclusion du fichier : ocidl.h et dans ce fichier aparament il y a declaration d'une classe IFont : la meme chose que moi.

    Et je crois que mon probleme vient de là ? mais j'en sais rien comment le resoudre.

    Merci

  8. #8
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    possibilité de mettre un namespace ....

    http://c.developpez.com/faq/cpp/?page=namespace

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut
    Citation Envoyé par rikau2
    possibilité de mettre un namespace ....

    http://c.developpez.com/faq/cpp/?page=namespace

    J'ai deja essayer de faire un namespace comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     
    #pragma once
    #include <afxwin.h> // MFC core and standard components
    #include <afxtempl.h>
     
    namespace ImportDll {
     
     
    	class IFont
    	{
    	public:
     
    		/*IFont(const char*, const char*, const char*);
    		IFont(const char*, const char*, int);*/
    		IFont();
    		~IFont();
    		float Height();
    		float Baseline();
    		float Width(const char* s, int length);
    		void Extents(const char* s,int i, Text_Extent* e);
    	};
     
     
    template <class T>
    	class MapIPaint {
     
    	protected:
    		// void Init(const char*);
    		// void DefineEntries(const char*);
    		// void DefineInitial(const char*);
    		// T* CreateEntry(const char*);
     
    		int initial;		// denotes which entry is used on startup
    		CArray<T*> m_ptArray;
    		int m_current;
     
    	public:
    		T* FindOrAppend(const CString& str);
    		T* FindOrAppend(unsigned char r, unsigned char g, unsigned char b);
    		T* FindOrAppend(bool none, int p, float w, int l, int r, int z=false);
    		INT_PTR Size() const;
    		bool AtEnd();
    		T* First();
    		T* Last();
    		T* Prev();
    		T* Next();
    		int GetCurrentIndex();
    		T* GetCur();
    		T* Index(int index) const;
    		int Find(const T* obj) const;
    		void setInitial(int i);
    		T* GetInitial();
    	};
     
    }// mportDll
    et dans le .cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "mapipaint.h" // qui contient le namespace
    using namespace ImportDll;
     
    ...........
    et quand j'ai compile j'ai eu cette erreur :
    d:\kaledo\kaledocollection_vs2005_kassem\6_product\kaledostyle\importdll\utilities\mapipaint.cpp(81) : error C2872: 'IFont' : ambiguous symbol
    could be 'c:\program files\microsoft visual studio 8\vc\platformsdk\include\ocidl.h(3533) : IFont' //
    or 'd:\kaledo\kaledocollection_vs2005_kassem\6_product\kaledostyle\importdll\utilities\mapipaint.h(60) : ImportDll::IFont'

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    La seule solution que je vois est de changer le nom de ta classe.
    En effet, contrairement aux libs qui sont bien programmées (houuu pas bô le troll), ma MFC déclare tout dans le namespace global.

  11. #11
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Justement ne pas mettre de using namespace car cela masque l'interet de celui ci.

    Il faut utiliser ta classe en faisant par exemple:

    ImportDll::IFont MyIFont = new ImportDll::IFont(...

    le using namespace t'evite de faire le mynamespace::maclasse ... tu cherches justement a faire le contraire !

    Une autre solution, mais la a verifier, si tu veux utiliser les elements qui ne font pas parti de ta classe, essayes ::IFont pour l'appel a la standard, et IFont simplement pour l'appel a ta classe

  12. #12
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut
    Citation Envoyé par r0d
    La seule solution que je vois est de changer le nom de ta classe.
    En effet, contrairement aux libs qui sont bien programmées (houuu pas bô le troll), ma MFC déclare tout dans le namespace global.
    Mais je n'arrive pas a comprendre pourquoi il y a une erreur ambiguous symbol
    alors que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using namespace importDll // le name space qui contient la classe
    En fait pourquoi il n'arrive pas a faire la difference ?

  13. #13
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    En fait rikau2 a raison.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #pragma once
     
    namespace Dum
    {
     
    class IFont
    {
    // code
    };
     
    };
    suivi de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dum::IFont myFont = Dum::IFont();
    ça fonctionne (il ne faut pas utiliser de using, sinon il se perd).

  14. #14
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    lorsque l'on declare un namespace c'est pour "cacher" des données derriere. Ca permet alors de definir plusieurs fois le meme non de methode, variable, classe, ... ou plutot si plusieurs personnes travaillant sur un meme projet developpent dans leur coin, si toutes les deux, par le plus grand des hasard , a le meme nom de classe, le compilateur ne sais pas lequel choisir.

    Dans ton cas c'est exactement ca, tu as deux elements qui possedent le meme nom, ton compilateur t'injure car il ne sait pas faire la difference. C'est la que le namespace arrive.........

    la directive using namespace std (par exemple) t'evite d'ecrire devant chaque element du namespace std, exemple cout, cin, cerr... l'element std::cout, std::cerr, ...

    Le probleme apparait si deux personnes declarent un namespace std, le compilateur ne peut faire de differences.

    lorsque tu mets using namespace ImportDll, tu masques l'utilitées du namespace, et tous les elements de ton namespace apparaissent pour le compilateur, sous la directive using namespace..., comme des elements ne necessitant pas le prefixe de ton namespace, et la on tourne en rond....

    Donc pour que ca marche, laisse ton namespace, enleve le using namespace ..., et devant chaque element du namespace, tu met monNamespace:: et la le compilo sera content

  15. #15
    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
    Par défaut
    IFont est une classe COM d'ou le problème ...

  16. #16
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 86
    Par défaut
    Citation Envoyé par farscape
    IFont est une classe COM d'ou le problème ...
    D'accord et c'est quoi la solution ? Il faut absolument alors faire un namespace ? ou il y a d'autre moyen?

    Et quand vous dites c'est un objet COM d'ou le probleme , ca signifie quoi ?

    Merci en avance

  17. #17
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Ca veut dire que via des includes on dispose de cette classe, et quand le compilateur rencontre ton IFont, il nous signale qu'il a deux IFont.
    Donc 2 solutions :
    - Tu mets ton IFont dans une namespace
    - Tu changes le nom de ton IFont

  18. #18
    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
    Par défaut
    ta classe rentre en conflit avec celle définie dans un header ole (ocidl.h),
    La seule solution viable c'est le namespace pour ta classe.

Discussions similaires

  1. Réponses: 21
    Dernier message: 16/09/2013, 22h00
  2. Réponses: 2
    Dernier message: 25/03/2009, 10h51
  3. type complex avec Visual C++ 2005
    Par plessis dans le forum Visual C++
    Réponses: 2
    Dernier message: 02/05/2007, 14h21
  4. [LG]Type chaine avec plus de 255 car et EOF intempestif.
    Par jpclabaux dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2004, 10h39
  5. Type pour données de type email avec @
    Par jeff37 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/01/2004, 14h50

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