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 :

Fonction template dans une classe template


Sujet :

Langage C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Fonction template dans une classe template
    Bonjour,


    J'ai une classe que j'aimerai initialiser en lui passant un tableau de paires de chaîne de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class T>
    class MaClasse
    {
         template<unsigned int N> MaClasse(const char* sTab[N][2]);
    };
    Je n'arrive pas à implémenter cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template <class TKey, unsigned int N> MaClasse(const char* sTab[N][2]);
    Le compilateur me dit "error C2244: 'MaClasse<T>::{ctor}'*: impossible de faire correspondre la définition de fonction avec une déclaration existante"


    Quelqu'un peut-il m'aider ?


    Merci,


    A bientôt

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Est-ce que ceci marche ?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class TKey>
    template <unsigned int N> MaClasse<TKey>::MaClasse(const char* sTab[N][2])
    {
    }

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oui là la fonction compile mais l'utilisation déconne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const char* cTab[][2] = {{"ID1", "VALUE1"}, {"ID2", "VALUE2"}};
    MaClasse<int> obj(cTab);
    J'ai une erreur :
    error C2784: impossible de déduire l'argument modèle pour 'const char *[N][2]' à partir de 'const char *[2][2]'

    Y'es con c'compilateur :s


    Merci pour ton aide

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ha c'est bon, il fallait faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class TKey>
    template <unsigned int N> MaClasse<TKey>::MaClasse(const char* (&sTab)[N][2])
    {
    }

    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Et si tu passes l'argument par référence constante et non par valeur ?
    C'est ce que font les fonctions de la CRT Microsoft, comme strcpy_s...

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    C'est bien ce que j'ai fait les références constantes ? J'ai trouvé ça dans du code de boost.


    Par contre pour l'utilisation, je suis obligé de passer par un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const char* cTab[][2] = {{"ID1", "VALUE1"}, {"ID2", "VALUE2"}};
    MaClasse<int> obj(cTab);
    Mais je ne peux pas faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaClasse<int> obj({"ID1", "VALUE1"}, {"ID2", "VALUE2"});
    Y'a pas un moyen pour utiliser ce constructeur sans devoir déclarer de tableau juste avant ? C'est pour essayer d'être plus flexible.


    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Essai peut-être en rendant const ta référence:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class TKey>
    template <unsigned int N> MaClasse<TKey>::MaClasse(const char* const (&sTab)[N][2])
    {
    }

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Non ça ne fonctionne pas même avec ce const, mais là c'est une erreur de syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaClasse<int> obj({{"ID1", "VALUE1"}, {"ID2", "VALUE2"}});
    error C2143: erreur de syntaxe*: absence de ')' avant '{'

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Alors dans ce cas, tu dois passer par une déclaration. Dommage...

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ok, c'est pas grave.


    Merci beaucoup

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  2. Spécialisation de fonction template dans une class template
    Par summerstorm dans le forum Langage
    Réponses: 6
    Dernier message: 05/01/2010, 20h15
  3. Réponses: 4
    Dernier message: 20/10/2009, 08h54
  4. Réponses: 8
    Dernier message: 20/07/2007, 14h28
  5. Réponses: 4
    Dernier message: 08/11/2005, 15h10

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