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

Langage C++ Discussion :

template et erreur de compilation


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut template et erreur de compilation
    Bonjour a tous,

    Je bloque depuis un moment sur ce petit bout de code pas bien méchant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<int N,class T> template<template<class U> class C> inline void Vector<N,T>::Set(const C<T>& e){
    	C<T>::const_iterator i = e.begin();
    	for (int j=0; i != e.end(); ++i, ++j) {
    		elements[j] = *i;
    	}
    }
    Lorsque je veux le compiler, j'obtiens une erreur à la seconde ligne : expected ';' before "i" .

    Je souhaite creer une classe vector qui puissent se remplir a partir d'un contener quelquonque pourvu qu'il supporte les iterators.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    Hébé,
    compliqué comme écriture!

    c'est la définition d'une fonction template d'une classe template?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template<int N,class T>
     template<template<class U>, class C>    //il manque pas la virgule la?
    inline void Vector<N,T>::Set(const C<T>& e){
    	C<T>::const_iterator i = e.begin();
    	for (int j=0; i != e.end(); ++i, ++j)    //premiere fois que je vois une boucle for ecrite comme ca... t'as le droit de faire plusieurs incrementations?
            {
    		elements[j] = *i;
    	}
    }

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    C'est bien une fonction template d'un classe template. Mais pour parfaire le tout, la pramettre de la template de la fonction est lui meme une template (c'est un contener comme par exemple std::vector<int>).

    La virgule n'a donc pas lieu d'être. Et oui, j'ai le droit d'avoir deux incrémentation dans mon for, ainsi que deux initialisations.

    Mais tu as bien cerné le problème : toutes ces templates rendent le tout difficile a cerner. Au passage, si quelqu'un a des conseil pour rendre le tout plus lisible je prend aussi .

    EDIT: par contre, on peut virer le U :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<int N,class T> template<template<class> class C> inline void Vector<N,T>::Set(const C<T>& e){
    	C<T>::const_iterator i = e.begin();
    	for (int j=0; i != e.end(); ++i, ++j) {
    		elements[j] = *i;
    	}
    }
    Ce qui ne change strictement rien : toujours une erreur a la seconde ligne.

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par défaut
    @loicounet

    Non, il ne manque pas de virgule, ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<template<class U> class C>
    indique que le paramètre template C doit être lui même un type paramétré.
    Et oui, on a le droit d'effectuer autant d'opérations que l'on souhaite dans une boucle for, que ce soit pour l'initialisation ou l'incrémentation.

    @deadlnix

    Il faut indiquer au compilateur que est un type, par l'utilisation du mot-clé typename :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename C<T>::const_iterator i = e.begin()
    (cf. la FAQ)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    Yeah, c'est exactement ce qu'il me fallait.

    J'étais passé a coté de ce point dans la FAQ.

    Merci a vous deux !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/05/2011, 19h42
  2. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  3. Réponses: 4
    Dernier message: 12/05/2009, 13h52
  4. templates et erreur de compilation
    Par Rniamo dans le forum C++
    Réponses: 2
    Dernier message: 14/06/2008, 19h51
  5. [Debutant c++] erreur de compilation de template
    Par wdionysos dans le forum Langage
    Réponses: 7
    Dernier message: 22/06/2006, 19h10

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