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

C++ Discussion :

fonction et classe tempalte


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Points : 61
    Points
    61
    Par défaut fonction et classe tempalte
    bonjour,

    voila, je viens de créer une classe template ( array<elm> ) qui a une focntion privée bool isempty(). je souhaite créer une fonction extérieur à a classe que j'ai déclarer comme friend dans la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class elm>
    bool isempty(array<elm> a){
      return a.isempty();
    }
    mais le problème, c'est que ça me dit [linker error]undefined reference to 'isempty(array<int>)'

    je ne comprend vraiment pas pourquoi car la fonction est dans le même fichier que main() et que celle ci focntionnne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool isempty(array<int> a){
      return a.isempty();
    }
    ce qui et bien mais pas suffisant

    merci si vous pouvez m'aider

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    j'ai déjà regardé, mais ça ne m'aide pas, la fonction qui ne marche pas n'est pas une fonction menbre de la classe et même si je la place au même endroit que les autres fonctions membres de la classe, cela ne marche pas non plus :s

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le corps de ta fonction ne se trouve pas dans un .cpp ? On peut avoir plus de précisions ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    voila les fichier que j'ai:
    main.cpp, contient:

    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
     
    ...
     
    include "array.h"
     
    template <class elm>
    bool isempty(array<elm>){
      ...
      return ...;
    }
     
    int main(...){
      ...
      array<int> a;
      isempty(a);
     
      return 0;
    }
    array.h, contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template<class elm>
    class array{
      friend bool isempty(array);
      private:
        bool isempty();
        ....
      public:
        ...
    };
     
    #define ARRAY_H
     
    #include "array.cpp"
    et array.cpp, contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #ifdef ARRAY_H
    ...
     
    template<class elm>
    bool array<elm>::isempty(){
      ...
    }
    #endif
    voila, j'ai toujours rien trouvé pour arranger ça :s

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Quelques conseils :

    - Tu devrais renommer tes .cpp contenant des templates en .inl ou autre. Déjà ça fera plus "propre", et ensuite tu es sûr que ton compilo ne va pas les compiler.

    - Pas besoin de toutes ces manips avec le preprocesseur :

    array.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
    #ifndef ARRAY_H
    #define ARRAY_H
     
    template<class elm>
    class array{
      friend bool isempty(array);
      private:
        bool isempty();
        ....
      public:
        ...
    };
     
    #include "array.inl"
     
    #endif

    array.inl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class elm>
    bool array<elm>::isempty(){
      ...
    }
    Mais je ne pense pas que ça reglera ton problème (sinon tu aurais le même message d'erreur pour toute ta classe array).

    L'erreur doit être dans la déclaration de ta fonction amie. Ce n'est peut-être pas exactement équivalent à ton code initial, mais au moins ça marchera (je pense) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<class elm>
    class array{
      template <class U>
      friend bool isempty(array<U>);
     
    ...
    };

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    haaa! il fallait 'templatiser' la fonction a l'intérieur de la classe! j'y avais pas pensé!

    je vais essayé ça. pour les trucs avec le prépross, j'ai fait comme indiqué sur la FAQ mais ça fera mieux come ça, c'est sur.

  8. #8
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le problème, c'est que là n'importe quel array<T> sera ami avec n'importe quel isempty<U>(). Ce n'est généralement pas gênant, mais il y a une syntaxe qui limite l'amitié au minimum nécessaire, je crois que c'est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<class elm>
    class array{
     
      friend bool isempty<elm>(array<elm>);
     
    ...
    };
    Je ne suis plus sûr de la syntaxe, et je sais qu'elle pose des problèmes aux compilos. Tu peux essayer de retrouver les topics traitant du sujet sur ce forum (il y en a un ou deux), au pire ma solution précédente marchera toujours

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 76
    Points : 61
    Points
    61
    Par défaut
    voila ça marche nikel! merci bcp je vais pouvoir faire de la récursivité :d

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

Discussions similaires

  1. fonctions inter- classes
    Par THE_VIP dans le forum Général Python
    Réponses: 5
    Dernier message: 12/08/2006, 00h51
  2. Appel de Fonction entre classes
    Par likenoother dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2006, 14h37
  3. [C#]Fonction ou classe ?
    Par pierre1256 dans le forum C#
    Réponses: 3
    Dernier message: 30/05/2006, 13h53
  4. fonctions et classes... quand les utiliser ?
    Par fastmanu dans le forum Langage
    Réponses: 6
    Dernier message: 03/04/2006, 00h39
  5. Accèss à des fonctions entre classes
    Par vincetrader dans le forum C++
    Réponses: 4
    Dernier message: 08/09/2005, 13h45

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