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 template et name dependent lookup


Sujet :

Langage C++

  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut template template et name dependent lookup
    J'ai un mal fou à trouver un titre correct pour ce sujet...
    J'étais venu avec une question, et en la rédigeant j'ai fini par trouver la bonne syntaxe, je suppose que ça serait pas mal de l'ajouter à la FAQ.

    Quand on a un type membre d'une classe, il est nécessaire dans un contexte template de préfixer ce type du mot clé typename pour indiquer au compilateur qu'on attend bien un type (cf. FAQ: A quoi sert le mot-clé typename ?) :
    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
    #include <iostream>
    #include <typeinfo>
     
    struct test {
        // 'type' est un type simple
        using type = int;
    };
     
    template<typename T>
    void print_type() {
        std::cout << typeid(T).name() << std::endl;
    }
     
    template<typename T>
    void print() {
        // print_type<T::type>();
        // ^ ne compile pas, il faut ajouter 'typename'
        //         v~~~~~~~
        print_type<typename T::type>();
    }
     
    int main() {
        print<test>();
        return 0;
    }
    En revanche, dans le cas d'un type membre template, la syntaxe est différente :
    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
    #include <iostream>
    #include <typeinfo>
     
    struct test {
        // 'type' est un type template
        template<typename T>
        struct type {};
    };
     
    template<template<typename> class T>
    void print_type() {
        std::cout << typeid(T<int>).name() << std::endl;
    }
     
    template<typename T>
    void print() {
        // print_type<T::type>();
        // ^ ne compile pas, il faut ajouter 'template'
        //            v~~~~~~~
        print_type<T::template type>();
    }

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    C'est vrai qu'une entre dans la FAQ serait bien pour la syntaxe.
    Car la raison est la même que pour typename. Le compilo n'a pas moyen de savoir que type est bien bien une classe template et non un type classique.

    C'est d'ailleurs sa première supposition puisque g++ me sort pour print_type<T::type>();
    prog.cpp:17:26: error: dependent-name ‘T:: type’ is parsed as a non-type, but instantiation yields a type
    note: say ‘typename T:: type’ if a type is meant
    Edit : Une proposition pour la FAQ est lancée
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. Problème avec template template template
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2012, 14h40
  2. Template, template, encore des template
    Par olivier1978 dans le forum Langage
    Réponses: 1
    Dernier message: 16/11/2007, 20h33
  3. [Template] Template et Arbre
    Par GrooveRage dans le forum Langage
    Réponses: 4
    Dernier message: 18/05/2007, 11h28
  4. template > template >
    Par Nomade95000 dans le forum Langage
    Réponses: 6
    Dernier message: 10/05/2007, 18h21
  5. template<template<>>
    Par joker34 dans le forum C++
    Réponses: 7
    Dernier message: 25/01/2006, 09h45

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