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 :

Typedef sur fonction template


Sujet :

Langage C++

  1. #1
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut Typedef sur fonction template
    Bonsoir,

    J'essaye d'écrire une classe conteneur (classe template) non présente dans la STL.
    J'ai une des méthodes de ce conteneur qui prend en argument une fonction de callback (fonction template).

    Mon problème est que j'ai une incompatibilité de type entre le typedef de ma fonction callback et l'appel que je fais à ma méthode.

    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
    template<typename T>
    void as_vector_callback(cont_cell<T> &cell) {
    ...
    }
     
    template<typename T>
    class cont {
      public:
        typedef void (*callback_t)(cont_cell<T> &cell);
      public:
        void as_vector(std::vector &v) {
           walk(as_vector_callback);
        }
      protected:
        void walk(callback_t callback);
    ...
    };
     
    cont<int> c;
    std::vector v;
    ...
    c.as_vector(v);
    A la compilation (VC+ 6 Windows) j'ai le message d'erreur :

    error C2664: 'as_vector' : cannot convert parameter 1 from 'void (class cont<T> &)' to 'void (__cdecl *)(class cont<int> &)'

    Une idée ?

    EDIT : en recopiant l'erreur je vois qu'il y a un pb entre <T> et <int> et que ce que je passe à walk n'est pas une fonction !
    Je poursuit mes investigations.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    as_vector_callback est un template (modèle) de fonction, pas une fonction. Par contre ses instanciations le sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    walk(&as_vector_callback<T>)

  3. #3
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    C'est exactement ce que je me disais, mais même en utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    walk(&as_vector_callback<T>)
    // au lieu de :
    //walk(&as_vector_callback)
    J'obtient exactement le même message d'erreur.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    J'ai pas l'impression que tu nous donnes le bon code. D'une part std::vector tout seul ça ne compile pas (std::vector<T> ou std::vector<int> par contre oui). D'autre part le compilo parle du paramètre 1 de as_vector comme d'un pointeur sur fonction, or dans ton code c'est un std::vector&.

  5. #5
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Erreur typographique (ma machine de dev est isolé d'Internet, donc je recopie et simplifie le code à la main) :

    Code :

    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
    template<typename T>
    void as_vector_callback(cont_cell<T> &cell) {
    ...
    }
     
    template<typename T>
    class cont {
      public:
        typedef void (*callback_t)(cont_cell<T> &cell);
      public:
        void as_vector(std::vector<T> &v) {
           walk(as_vector_callback);
        }
      protected:
        void walk(callback_t callback);
    ...
    };
     
    cont<int> c;
    std::vector<int> v;
    ...
    c.as_vector(v);
    Message d'erreur :

    error C2664: 'walk' : cannot convert parameter 1 from 'void (class cont<T> &)' to 'void (__cdecl *)(class cont<int> &)'
    while compiling class-template member function 'void __thiscall cont<int>::as_vector(std::vector<int> &)'

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Chez moi (VC++ 2005) ça compile très bien. C'est donc une fois de plus VC++ 6 qui ne sait définitivement pas gérer les templates.

  7. #7
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Ok, installation du SP6 pour VC6 et si ça ne marche pas => upgrade vers VC 2005.

    Je reviens dés que j'ai une réponse.

    Note : tu utilise quelle release de VC 2005 (l'express ?). Par ce que malheureusement cela peut faire une différence.

  8. #8
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Bon j'ai modifié un peu le code, et ça compile à la fois sur VC++ 6 et VC++ 2005.

    Fichier a.h :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdio.h>
    #include <assert.h>
     
    template<typename T>
    void print(T &cell) {
    }
     
    template<>
    void print(int &cell) {
      printf("- cell value : %d\n", cell);
    }
     
    template<typename T>
    class vector {
      public:
    	typedef T* iterator;
      public:
    	vector(const T *data, size_t nb) {
    	  size_t i;
     
    	  _size = nb;
    	  _data = new T[_size];
          for (i = 0; i < _size; i++)
    		_data[i] = data[i];
    	}
    	size_t size() const {
    	  return _size;
    	}
    	T& get(size_t i) {
    	  assert(i < size());
    	  return _data[i];
    	}
      protected:
    	size_t _size;
    	T *_data;
    };
     
    template<typename T>
    void as_vector_callback(vector<T>::iterator &cell) {
      printf("as_vector_callback called\n");
      print(*cell);
    }
     
    template<typename T>
    class cont {
      public:
        typedef void (*callback_t)(vector<T>::iterator &cell);
      public:
        void as_vector(vector<T> &v) {
          printf("as_vector called\n");
          walk(v, &as_vector_callback<T>);
        }
      protected:
        void walk(vector<T> &v, callback_t callback) {
    	  size_t i, n;
    	  vector<T>::iterator iter;
     
    	  n = v.size();
    	  for (i = 0; i < n; i++) {
    		iter = &v.get(i);
    		(*callback)(iter);
    	  }
        }
    };
    Fichier main.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    #include "a.h"
     
    int main() {
      cont<int> c;
      int a[] = { 1, 3, 7, 5, 9 };
      vector<int> v(a, 5);
     
      c.as_vector(v);
     
      return 0;
    }
    L'utilisation de 2005 (qui affiche des messages d'erreur beaucoup plus compréhensible) m'a permis d'isoler le pb.

    Le problème venait de ma définition de cont_cell<T> (maintenant appellée vector<T>::iterator), alors que le message d'erreur de VC++ 6 m'indiquait une erreur sur l'appel à walk() !!!

    Note : j'ai abandonné au passage l'utilisation de std::vector pour avoir des messages d'erreurs plus compréhensibles.

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 21/06/2013, 03h45
  2. Variadic template et pointeur sur fonction
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 14/02/2013, 20h57
  3. Restriction sur une fonction template
    Par Arzar dans le forum Langage
    Réponses: 12
    Dernier message: 02/10/2009, 00h06
  4. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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