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 :

std::bind sur une fonction d'une classe de base template


Sujet :

Langage C++

  1. #1
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut std::bind sur une fonction d'une classe de base template
    Hello,

    je bloque sur un petit problème : j'ai besoin d'une classe contenant un tableau de pointeur de fonctions, les fonctions pointées sont des membres de la classe de base.

    Dans le cas où la classe de base n'est pas template je n'ai pas de problème, lorsqu'elle l'est par contre ...
    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
    35
    #include <array>
    #include <functional>
    #include <initializer_list>
    #include <iostream>
     
    template <class T>
    struct base {
    	template <int I>
    	const T& foo(const T& t) {
    		std::cout << I << std::endl;
    		return t;
    	}
    };
     
    template <class T, int... Is>
    struct derivee: base<T> {
    	using arr_type = std::array<std::function<const T&(const T&)>, sizeof...(Is)>;
     
    	arr_type fct;
     
    	derivee():
    		fct {{ std::bind(&derivee::foo<Is>, this, std::placeholders::_1)... }}
    	{ }
    };
     
    int main() {
    	int i = 2;
    	derivee<int, 1, 2, 42> d;
     
    	for(auto f: d.fct) {
    		f(i);
    	}
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    g++-4.8 -o test test.cpp -std=c++11
    test.cpp: In constructor ‘derivee<T, Is>::derivee()’:
    test.cpp:22:37: error: expected primary-expression before ‘,’ token
       fct {{ std::bind(&derivee::foo<Is>, this, std::placeholders::_1)... }}
                                         ^
    test.cpp: In instantiation of ‘derivee<T, Is>::derivee() [with T = int; int ...Is = 1, 2, 42]’:
    test.cpp:28:25:   required from here
    test.cpp:22:33: error: address of overloaded function with no contextual type information
       fct {{ std::bind(&derivee::foo<Is>, this, std::placeholders::_1)... }}
                                     ^
    Je peux m'en sortir en plaçant foo dans derivee, et donc sans héritage. Mais les spécialisation de foo seraient plus chiante à écrire.
    (Puis je suis currieux de savoir pourquoi ça marche pas si la classe de base est template)

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    Le compilateur manque d'information pour comprendre que la fonction est template, indiques lui en rajoutant template devant foo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::bind(&derivee::template foo<Is>, this, std::placeholders::_1)
    Le pourquoi c'est justement parce que ta classe de base dépend d'un paramètre template, il ne sait donc pas ce qu'il y a dedans avant l'instanciation. C'est un problème très similaire à celui de typename.

    Ainsi dans ce cas il interprète ça comme l'adresse d'une fonction foo (non template) d'un opérateur <, d'un entier, d'un opérateur > et d'un oubli de ta part .

    L'ajout de ce "template" lui permet de comprendre qu'il doit interpréter le prochain couple <> comme la syntaxe des template.

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Mouarf c'était tout con, merci

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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. récupérer une variable d'une fonction dans une classe
    Par free_dom dans le forum Général Python
    Réponses: 20
    Dernier message: 08/07/2009, 12h35
  3. Réponses: 8
    Dernier message: 10/01/2007, 21h10
  4. [PHP-JS] une fonction dans une fonction
    Par lodan dans le forum Langage
    Réponses: 6
    Dernier message: 25/06/2006, 19h14
  5. Réponses: 3
    Dernier message: 29/04/2006, 13h02

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