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

Autres éditeurs Discussion :

Visual Studio .Net et template


Sujet :

Autres éditeurs

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut Visual Studio .Net et template
    Salut,

    J'essaye de convertir mes projets visual studio 6.0 vers visual studio .Net. Le probleme c'est que ce dernier me sort des erreurs de compilation que je ne comprends pas (ça compile trés bien sous VS 6). Ces erreurs ont lieu sur des definitions de fonctions ou classes template, c'est pour quoi je poste ici. Si les moderateurs estiment que ce sujet est plus directement lié à VS6 merci de le déplacer .

    Bref voilà par exemple une fonction sur laquelle il plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<typename T> std::list<T>::iterator FindInList(std::list<T> &List, const T &ToFind)
    {
         for(std::list<T>::iterator it = List.begin() ; it != List.end() ; ++it)
         {
            if((*it) == ToFind)
            {
                return it;
            }
         }
     
          return List.end();
    }
    C'est une fonction tte simple qui se contente d'itérer dans une std::list<T> jusqu'a trouver le bon élément, et j'ai droit à des erreurs du genre :

    error C2146: syntax error : missing ';' before identifier 'FindInList'
    error C2501: 'std::list<_Ty>::iterator' : missing storage-class or type specifiers
    error C2065: 'T' : undeclared identifier
    error C2955: 'std::list' : use of class template requires template argument list


    Est-ce que qqun a une idée ? La gestion des templates sous VS .Net a t'elle changé ?
    [Sujet déplacé par Farscape]

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    T'as bien inclu <list> ?

    Mais si tu refais toutes les fonctions de la STL t'es pas arrivé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <algorithm>
     
    std::list<T>::iterator It = std::find(List.begin(), List.end(), ToFind);

    PS : je ne pense pas que ça ait un rapport avec VC7, il aurait mieux valu laisser le sujet dans le forum C++

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tiens effectivement ça ne compile pas héhé

    Mais VC7 est sympa, il t'indique comment résoudre le problème

    Citation Envoyé par VC7
    warning C4346: 'std::list<_Ty>::iterator'*: le nom dépendant n'est pas un type
    préfixer avec 'typename' pour indiquer un type
    Ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> typename std::list<T>::iterator FindInList(std::list<T> &List, const T &ToFind)

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Effectivement ça compile, merci. Tu sembles avoir un VS.Net en français qui t'indique comment corriger le probleme, le message en anglais est bien moins explicite.
    Reste que je ne comprends pas bien cette nouvelle syntaxe, ni pourquoi ça compile bien sous VS 6. Est-ce que cette syntaxe est plus "standard" ?

    PS : effectivement cette fonction existe tte faite dans la stl, mais je l'ai ecrite il y a longtemps alors que je ne le savais pas. C'est un relicat de cette époque .

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'avoue que j'ai jamais trop cherché à comprendre l'utilisation de typename dans ce cas, il faut dire que ça n'arrive pas souvent. A priori ça permet d'indiquer au compilo que ce qui suit est un type, lorsqu'il ne peut pas le savoir tout seul (à cause du fait que tu manipules des templates).

    Et je ne sais pas non plus pourquoi ça compile sous VC6

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    IIRC, VC 6 est pré-98 et d'après ce que j'en sais la nécessité d'utiliser typename a été "confirmée" avec la norme.
    Cela sert effectivement à indiquer que l'identificateur qui ne peut pas être connu avant l'"expansion" des templates est un type.

    Quant à la gestion des template sous VS.NET, elle a fait énormément de progrès. Ce qui est une bonne chose. C'était un des points faibles de VC6 et de beaucoup d'autres compilateurs de la même époque.

    PS: je pense aussi que le forum principal été plus adapté.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Création d'un template de projet personnalisé dans Visual Studio .NET
    Par Marie-Hélène dans le forum Visual Studio
    Réponses: 0
    Dernier message: 20/05/2005, 12h00
  2. [Visual Studio .NET] Problème de compilation
    Par black is beautiful dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/04/2005, 17h55
  3. probleme de link avec visual studio .net 2003
    Par kamal101 dans le forum MFC
    Réponses: 9
    Dernier message: 28/03/2005, 21h44
  4. [C#] Probleme de visual studio.net 2003
    Par gandalfar dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/01/2005, 14h53
  5. Probleme d'utilisation de directX 9 avec visual studio.net
    Par cranedoeuf dans le forum DirectX
    Réponses: 1
    Dernier message: 24/05/2004, 04h33

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