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 :

Paramètre template et itérateur de set.


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut Paramètre template et itérateur de set.
    Bonjour,

    Dans l'initialisation de ma première boucle "for" (et pas foreach).
    Le compilateur m'indique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    expected ';' before 'kA'
    J'ai essayé de retirer l'ensemble du code et de garder uniquement la ligne qui pose problème et j'obtiens toujours la même erreur.

    Quelqu'un aurait une idée ?

    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
     
    template< class C >
    QSet< const QPair< const C*, const C* > > Quadtree< C >::couples() const
    {
        QSet< const Quadtree* > kLeaves = leaves();
        QSet< QPair< const C*, const C* > > kCouples;
     
        foreach(const Quadtree* pkLeaf, kLeaves)
        {
            const QSet< const C* >& rkItems = pkLeaf->items();
     
            for(QSet< const C* >::ConstIterator kA = rkItems.begin();
                kA != rkItems.end() && kA + 1 != rkItems.end();
                ++kA)
            {
                for(QSet< const C* >::ConstIterator kB = kA + 1;
                    kB != rkItems.end();
                    ++kB)
                {
                    // No coupling with itself.
                    Q_ASSERT(*kA != *kB);
     
                    // The address comparaison, ensure that a pair is always stored the same way.
                    // Permutation are not possible.
                    if(*kA < *kB)
                        kCouples.insert(QPair< const C*, const C* >(*kA, *kB));
                    else
                        kCouples.insert(QPair< const C*, const C* >(*kB, *kA));
                }
            }
        }
     
        return kCouples;
    }
    PS : Lorsque je retire la ligne qui pose problème, ça compile normalement.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Peut-être typename QSet< const C* >::ConstIterator ?

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    C'est quasiment certainement ça, puisque C est un paramètre template, et qu'il est transmis à une autre template.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup,

    C'était bien ça.
    Je pense comprendre pourquoi il est nécéssaire de rajouter typename, mais une explication détaillée serait la bienvenue. (Ou peut être une voie sur laquelle chercher).

    Merci.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    il faut un typename chaque fois que tu veux un type contenu dans un parametre template

    Soit la fonction template <typename T> T::value_t incremente(T::base_t t){return t+1;}.

    C'est joli, c'est logique, et ca suppose que T::value_t soit un type (pour lequel t+1 existe)

    Nourrissons le.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename T>
    struct unconst{
        typedef T base_t;
        typedef T value_t;
    }
     
    template <typename T>
    struct unconst<const T>{
        typedef const T base_t;
        typedef T value_t;
    }
    .

    ceci est destiné à supprimer les const. (assez mal, c'est juste pour l'exemple)
    On peut penser appeler int i =incremente< unconst<int> >(2);.

    mais suppose qu'un petit malin écrive:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <>
    struct unconst<void>{
        int base_t;
        int value_t;
    }
    .

    comment t'en sortirai tu avec la fonction incremente< unconst<void> >, maintenant que base_t et value_t ne sont meme plus des types?

    typename sert à dire au compileur "Je pense que ceci est un type, tu es autorisé à le vérifier."

    Ca, c'était ma petite explication. Pour plus de détails, il me semble que la faq contient une entrée sur le sujet.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Limiter les types des paramètres templates?
    Par Pragmateek dans le forum C++
    Réponses: 9
    Dernier message: 29/08/2006, 14h14
  2. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 13h50
  3. Réponses: 15
    Dernier message: 21/08/2006, 02h41
  4. Déclarer un paramètre template comme friend
    Par YéTeeh dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2006, 15h00
  5. X paramètres templates
    Par Alp dans le forum C++
    Réponses: 8
    Dernier message: 04/04/2006, 23h10

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