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 :

Problème déduction paramètre template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut Problème déduction paramètre template
    Bonjour,

    Petit souci avec la déduction de paramèter template template. J'ai la classe suivante :

    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
     
     
    template <class T, bool MatrixOrientation = true>
    class BidimensionalVector {
     
    public:
     
    inline void push_back_column(const std::vector<T>& column) {
        push_back_column_impl(column,1);
    }
     
    inline void push_back_column(const BidimensionalVector& column) {
        push_back_column_impl(column,column.xsize());
    }
     
    private:
     
    template <template <class> class C>
        void push_back_column_impl(const C<T>& column, size_type ncolumn);
     
    };
     
    //Plus loin implémentation de la fonction push_back_column_impl
    Le problème est que lorsque j'appelel cette fonction push_back_column, j'obtiens le message d'erreur suivant de Visual :
    could not deduce template argument for 'const C<T> &' from 'const std::vector<_Ty>'
    with
    [
    T=double
    ]
    and
    [
    T=double
    ]
    and
    [
    _Ty=double
    ]
    Alors que le même code compile et fonctionne parfaitement avec gcc. J'avoue que je suis un poil perplexe

    Bon je peux résoudre le pb en utilisant un simple paramètre template pour am fonction plutôt qu'un template de template, mais j'aimerais comprendre d'où vient le souci.

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    std::vector<T> ne vérifie pas template <class> class C> C<T>

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par loufoque Voir le message
    std::vector<T> ne vérifie pas template <class> class C> C<T>
    Justement il devrait utiliser la classe template std::vector plutôt que le type std::vector<T> non ? Enfin ma question porte plus sur le comment cela devrait fonctionner, étant donné que je n'ai pas cette erreur sous gcc (à moins que gcc ne se permette des déductions non conformes).

    A NiamorH : effectivement je n'avais pas pensé à cette solution, mais dans ce cas il faudrait que je rajoute les mêmes paramètres pour la classe Bidimensional sinon je vais avoir le même souci avec l'autre surcharge de push_back_column.

    Bref, je vais utiliser un paramètre simple pour solutionner le problème, merci pour vos réponses :p

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    En fait, ici, tu n'as aucun intêret à utiliser des parametres templates templates effectivement. Autant utiliser des paramêtres templates simples.

    Pourquoi ? Parce que l'utilité des paramètres templates templates c'est de pouvoir écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classe<int, std::vector> maClasse;
    à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classe<int, std::vector<int> > maClasse;
    Or sur une méthode avec déduction des paramètres templates, tu auras toujours cette écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maClasse.MaFonction( monVector );
    il y a tout de même des cas où tu peux vouloir instancier ton vector avec autre chose que T. Dans ce cas il faut que tu fasses une spécialisation.

    Enfin ma question porte plus sur le comment cela devrait fonctionner
    Citation Envoyé par C++ Templates : The Complete Guide
    The problem is that a template template argument must be a template with parameters that exactly match the parameters of the template template parameter it substitutes. Default template arguments of template template arguments are not considered, so that a match cannot be achieved by leaving out arguments that have default values.

  5. #5
    screetch
    Invité(e)
    Par défaut
    gcc 3 est non conforme et matche les arguments de templates par défaut. je n'ai pas testé sous gcc 4, je ne me souviens plus.

    en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template< class C1, class C2=C1> class A;
    gcc arrive a deduire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template< template<class C> class _A >
    alos que le standard dit que non.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Mon test était fait sous gcc 4, donc ça n'a pas été corrigé.

    @NiamorH : d'un point de vue purement technique je suis entièrement d'accord avec toi, c'était plus pour spécifier que le paramète était un conteneur, même si au final la seule chose qu'on peut spécifier est que le paramètre est templaté, c'est là que les contraintes sur paramètres template seraient intéressantes.

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <template <class> class C>
        void push_back_column_impl(const C<T>& column, size_type ncolumn);
    A mon avis, ça devrait mieux marcher comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template < template < class TYPE, class ALLOC > class C > 
        void push_back_column_impl(const C<T>& column, size_type ncolumn);

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

Discussions similaires

  1. Problème paramètre template match
    Par ilzzw dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/11/2014, 12h12
  2. Problème de map avec paramètre template
    Par bouba dans le forum Langage
    Réponses: 5
    Dernier message: 11/05/2007, 13h19
  3. [POO] Problème de paramètre passé par référence
    Par dug dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/08/2005, 20h29
  4. [JSP] Problème passage paramètre
    Par besco dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 13/09/2004, 10h15
  5. [SWT] Problème de paramètre GridData
    Par yolepro dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 06/12/2002, 10h37

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