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 :

probleme de template et methode static


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Par défaut probleme de template et methode static
    Bonjour tous le monde, j'essaie de me lancer dans le template et je tombe sur un os .
    Peut-être que l'un d'entre vous pourra m'aider à corriger le problème ou à comprendre les concepts qui se cachent derriere mon exemple et empeche ce code d'etre compilé:

    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
     
    #include <iostream>
     
    using std::cerr;
    using std::cout;
    using std::endl;
     
    template<typename T>
    static T* whatType(void* iAddr)
    {
    	int* result = (int*)iAddr;
    	return result;
    }
     
    template<typename T>
    static void print(T iVal)
    {
    	cout<<"Valeur : "<<iVal<<endl;
    } 
     
    int main(void)
    {
    	int value = 5;
     
    	print(whatType(&value);
    	return 0;	
    }
    Ce code ne sert bien sur qu'a mettre en évidence l'erreur de compilation
    Merci d'avance pour vos réponses

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Par défaut
    Bonjour,

    Voici les 2 corrections nécessaires pour que cela compile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T>
    static T* whatType(void* iAddr)
    {
        int* result = (int*)iAddr;
        return (void**)result;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(void)
    {
        int value = 5;
        
        print(whatType<void*>(&value));
        return 0;    
    }
    Ci-dessous le lien vers le descriptif de l'erreur que tu obtenais.
    http://msdn.microsoft.com/en-us/library/az5wkwaw(VS.80).aspx

    Bonne journée;
    Agamitsudo.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Par défaut
    Une petite précision: Voici le message d'erreur

    sources/main.cpp:24: error: no matching function for call to 'whatType(int*)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Par défaut
    Merci pour cette réponse qui m'a bien orientée je me retrouve au final avec ce 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
     
    template<typename T>
    static T whatType(void* iAddr)
    {
    	int* result = (int*)iAddr;
    	return *result;
    }
     
    template<typename T>
    static void print(T iVal)
    {
    	cout<<"Valeur : "<<iVal<<endl;
    } 
     
    int main(void)
    {
    	int value = 5;
     
    	print(whatType<int>(&value));
    	return 0;	
    }
    la valeur affichée est bien 5 mais cela n'a plus le moindre interet puisque je doit préciser lors de l'appel de la fonction le type de retour...
    Le template perd alors tout son intéret !
    Je pensais pouvoir m'affranchir des <> lors de l'appel...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Déjà, quel est l'objectif supposé de ta fonction ?
    Que cherches-tu à faire, en somme ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 25
    Par défaut
    Grosso modo, dans la vrai vie, j'ai une structure qui peut contenir un nombre de champ undéfinis est de type undéfini ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    complexDate
    {
        int time;
        double reelle;
        double imaginaire
    };
    En fait cette structure va correspondre a un motif ecrit un certain nombre de fois successivement dans un fichier binaire

    j'ai ensuite une méthode template statique double moyenne(T* iAddrValue , int beg , int end).

    cette methode prend donc comme parametre un pointeur typé, et l'interval sur lequel va s'effectuer la moyenne.

    Or, je passe par une interface qui ne me fourni que l'addresse de la structure.
    J'ai donc imaginé une classe AttribInfo qui me fournies un offset a partir de l'addresse de la structure et un enum du genre INT, DOUBLE ... qui me fournie le type de l'attribut. (il y a donc un vector d'AttribInfo puisqu'une instance par attribut)

    Mon but est en (simplifiant le context) d'etre capable de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double moy = moyenne(index , beg , end);
    On suppose donc que listAttribInfo est visible par la méthode.

    J'ai pu le faire jusqu'a présent à l'aide d'un switch case sur AttribInfo comme suit (code simplifié):

    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
     
    static double moyenne(int index , int beg , int end)
    {
         AttribInfo* info = listAttribInfo.at(index);
         switch(info->getType())
         {
             //AddrStruct est l'adresse de la structure
              case INT:
                      int* addrValue = (int*)((int)AddrStruct + info->getOffset());
                      return moyenneT(addrValue , beg , end );
                      //moyenneT c'est la methode template de tout à l'heure
              case DOUBLE:
                      double* addrValue = (int*)((int)AddrStruct + info->getOffset());
                      return moyenneT(addrValue , beg , end );
                                        .
                                        .
                                        .
         }
    }
    Ca ça fonctionne mais ce qui me pose problème c'est de réécrire le switch case si je veux une nouvelle méthode du genre fft(index , beg , end)

    Mon but est donc de trouver une méthode effectue le switch case en retournant un pointeur typé mais sans perdre la généricité.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static double moyenne(int index , int beg , int end)
    {
         AttribInfo* info = listAttribInfo.at(index);
         return moyenne(whatType(index), beg ,end);
    //ou bien
         return moyenne(whatType(info), beg ,end);
    }
    J'espère mettre fait comprendre,

    Si quelqu'un a une idée...

Discussions similaires

  1. probleme avec une methode static dans le body d'une jsp
    Par amadou.deme dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 19/02/2007, 08h47
  2. Classe interne, methode static et ajout de boutons
    Par comme de bien entendu dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 09/03/2006, 14h13
  3. [phpBB] Template phpBB et/ou phpLib
    Par corwin dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 14/02/2006, 15h45
  4. Réponses: 13
    Dernier message: 15/11/2005, 15h47
  5. [Concept]Methode "static"
    Par Regis.C dans le forum Général Java
    Réponses: 5
    Dernier message: 04/01/2005, 10h10

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