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 :

probleme migration visual 2003 vers visual express 2008


Sujet :

Visual C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut probleme migration visual 2003 vers visual express 2008
    Bonjour à tous,

    Je suis en train de migrer un gros programme de visual 2003 vers visual c++ 2008 express. Le code suivant fonctionnait précédemment, mais maintenant j'ai une erreur de type error C2039 (voir à la fin).

    Le code en question implémente deux type d'itérateur (const et non const)
    dans une classe template :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
      template <class T> 
      class  CMyClass
      {
      public:
        class const_iterator;
        class iterator
          :public std::iterator<std::forward_iterator_tag,  T>
        {
        public:
          explicit iterator( T* el)
            :it(el){}
     
          iterator& operator++()
          {
            ++it;
            return *this;
          }
     
          iterator operator++(int) const
          {
            iterator t(*this);
            ++t;
            return t;
          }
     
          bool operator==(iterator const& other) const
          {return it == other.it;}
     
          bool operator!=(iterator const& other) const
          {return !(it == other.it);}
     
          bool operator==(const_iterator const& other) const
          {return it == other.it;}
     
          bool operator!=(const_iterator const& other) const
          {return !(it == other.it);}
     
          T& operator*() const 
          {return *it; }
     
          T* operator->() const 
          {return it; }
     
        protected:
          //pointeur sur l'élément en cours
          T* it;
          friend class const_iterator;
        };
     
        class const_iterator
          :public std::iterator<std::forward_iterator_tag, T>
        {
        public:
          explicit const_iterator(const T* el)
            :it(el){}
     
          const_iterator (const iterator& other)
          :it(other.it){}
     
          const_iterator& operator++()
          {
            ++it;
            return *this;
          }
     
          const_iterator operator++(int) const
          {
            const_iterator t(*this);
            ++t;
            return t;
          }
     
          bool operator==(const_iterator const& other) const
          {return it == other.it;}
     
          bool operator!=(const_iterator const& other) const
          {return !(it == other.it);}
     
          const T& operator*() const 
          {return *it; }
     
          const T* operator->() const 
          {return it; }
     
        protected:
          //pointeur sur l'élément en cours
          const T* it;
          friend class iterator;
        };
     
    error C2039: 'it'*: n'est pas membre de 'std::iterator<_Category,_Ty>'
    1>        with
    1>        [
    1>            _Category=std::forward_iterator_tag,
    1>            _Ty=slope_t
    1>        ]
    1>        d:\HOME\MyClass.h(161)*: lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    1>        .\HOME\MyClass.cpp(899)*: voir la référence à l'instanciation de la classe modèle 'MyNameSpace::CMyClass<T>::const_iterator' en cours de compilation
    1>        with
    1>        [
    1>            T=slope_t
    1>        ]
    1>d:\HOME\MyClass.h(161) : fatal error C1903: impossible de récupérer à partir des erreurs précédentes*; arrêt de la compilation
    J'imagine que c'est un problème de namespace ou inclusion de .h mais je ne trouve pas.
    Auriez-vous des idées?

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Eh bien apparemment les règles de cherche de nom ont du changer entre 2003 et 2008, parce que ce qui se passe certainement c'est que le type "iterator" ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          const_iterator (const iterator& other)
          :it(other.it){}
    désigne pour Visual 2008 la classe de base (std::iterator) et pas la classe iterator définie juste au-dessus.

    Je saurais pas te dire lequel à raison, alors dans le doute, mieux vaut désambigüiser.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    gcc, Sun CC, IBM xlC et comeauonline ont le meme comportement que Visual 2008. Devant cette unanimite, j'ai pas fait d'exegese pour retrouver la raison (la recherche des noms n'est pas particulierement ou le C++ brille par sa simplicite).

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ton aide.

    En effet j'ai résolu mon problème en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const_iterator (const iterator& other)
          :it(other.it){}
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const_iterator (typename const MyNameSpace::CMyClass<T>::iterator& other)
          :it(other.it){}
    Merci encore.
    Je n'avais pas trouvé sur le net ce type de problème lors de migration de visual 2003 vers 2008

Discussions similaires

  1. Migration Profil 2003 vers 2008
    Par I'mSky dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 21/02/2014, 16h28
  2. migration visual studio 2003 vers visual studio 2008
    Par Akossigno dans le forum Visual Studio
    Réponses: 1
    Dernier message: 18/05/2012, 12h01
  3. Migration Windows 2003 vers 2008
    Par partage_infos dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 03/04/2011, 23h20
  4. Migration projet VC++2003 vers VC++2005/2008
    Par FredSint dans le forum Visual C++
    Réponses: 1
    Dernier message: 21/01/2010, 09h00
  5. mémoire migration server 2003 vers server 2008
    Par zen28150 dans le forum Sujets
    Réponses: 2
    Dernier message: 03/11/2008, 17h02

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