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 :

Passer une fonction en template et instanciation


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut Passer une fonction en template et instanciation
    Bonjour,

    je rencontre un petit problème. J'ai crée un template qui doit me permettre de renvoyer un calcul. Or ce calcul dépend de la fonction choisie, que je passe donc en paramètre du template :

    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
    template <double(*K)(double)> class MLL{
    	public:
    	// Attributs
    	double a;
    	double b;
    	double c;
     
    	// Constructeurs
    	//MLL();
     
    	// Méthodes
    	double GetValeur(double u){
    		a = 0.0;
    		b = 0.0;
     
    		return (a+b+K(u));
    	}
     
    };
    Bon, la fonction qui sert au calcul est K, qui prend un double et qui renvoie un double. Ensuite, dans mon main, j'instancie cette class template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "MLL.h"
    #include "Fonctions_poids.h"
     
    #include <iostream.h>
     
    int main (){
    	MLL<&Gaussienne> modele1; 
    	modele1.GetValeur(2.0);
     
    }
    Et la fonction gaussienne est dans le fichier Fonctions_poids.cpp.
    Or apparemment, je ne peux pas effectuer modele1.GetValeur(2.0). L'erreur renvoyée est :

    undefined reference to `MLL<&(Gaussienne(double))>::GetValeur(double)'

    Avez vous une idée du problème ?

    Merci !

    PS : le calcul est bidon par rapport à ce que je veux faire, mais j'y vais petit à petit et ceci est le premier obstacle que je dois surmonter, donc vous attachez pas au sens de ce code, il n'y en a pas, je cherche juste à comprendre sur un exemple.

  2. #2
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Un template ça te permet de construire un model générique mais aucunement à instancier des choses... Dans ton cas tu peux par exemple passer ta fonction en paramètre au constructeur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut
    Ah en effet, c'est une meilleur idée, merci !
    Mais sinon, passer une fonction dans un template, c'est possible ? Si oui, ça sert à quoi ?

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Loïc B. Voir le message
    Or apparemment, je ne peux pas effectuer modele1.GetValeur(2.0). L'erreur renvoyée est :

    undefined reference to `MLL<&(Gaussienne(double))>::GetValeur(double)'

    Avez vous une idée du problème ?
    Ca me fait penser a http://cpp.developpez.com/faq/cpp/?p...VERS_templates, mais tel que tu as ecrit le code, le probleme ne devrait pas se poser.
    En tout cas je n'ai pas de probleme quand je fais un copier coller et ajoute ce qui se semble evident (la declaration et la definition de Gaussienne).

    Citation Envoyé par superspag Voir le message
    Un template ça te permet de construire un model générique mais aucunement à instancier des choses... Dans ton cas tu peux par exemple passer ta fonction en paramètre au constructeur.
    Le code qu'il a ecrit est parfaitement valide.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut
    Bon en effet, en passant la fonction au constructeur, ça marche bien.
    Et ça doit marcher avec le template également ?
    Bon je le retente, et en cas de souci je redemande...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut
    Re-moi,

    alors effectivement, j'ai réussi à faire fonctionner mon template de départ, mais bizarrement mon, problème se résout quand je fais un include de MLL.cpp alors que j'ai l'erreur décrite pour MLL.h, j'ai du mal m'occuper du .h...

    Merci !

    PS : après en template ou en constructeur, que choisir, j'imagine que ça dépend un peu de comment on imagine l'utilisation du programme non ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Citation Envoyé par Loïc B. Voir le message
    mon problème se résout quand je fais un include de MLL.cpp alors que j'ai l'erreur décrite pour MLL.h
    C'est tout à fait normal. Lis ceci.
    http://cpp.developpez.com/faq/cpp/?p...VERS_templates

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 123
    Par défaut
    Ah d'accord !! (révélation divine)

    Alors que je l'avais déjà lu suite au précédent conseil, mais je n'en avais pas alors compris le sens !

    Pas de bol : deux jours que je me met au C++ et déjà je touche aux problèmes qui font débat chez les développeurs de compilateurs !!!

    Du coup pour faire plus classique, je le met dans le constructeur, ça me fait moins peur !

    Merci à tous de votre aide... quelle efficacité !!

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/10/2007, 18h18
  2. Passer une fonction en paramètre ...
    Par Freeze dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/10/2005, 17h51
  3. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 14h58
  4. Réponses: 4
    Dernier message: 10/11/2004, 15h58
  5. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 14h41

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