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 :

Friend Classe Template


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut Friend Classe Template
    Bonjour,
    Je souhaite créer une fonction (Peek) qui soit friend d'une classe template (MyClass), avec une relation one-to-one. Après avoir pas mal cherché sur Internet, j'ai cette écriture ... qui ne compile pas (C:B). Le message d'erreur est "expected initialization before '<' ".
    Est-ce parce que la classe template doit être spécialisée avant (mais cela me semble surprenant). Avez-vous une idée ?

    La classe:
    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 <typename T>
    class MyClass
    {
        public:
            MyClass(T aT);
            void Show();
     
            friend void Peek(const MyClass<T> &mC);
     
            virtual ~MyClass();
        private:
            T t;
    };
    Mon main avec la fonction:
    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
     
    #include "MyClass.h"
     
    using namespace std;
     
    template <typename T> class MyClass;
     
    template <>
    void Peek<typename T>(const MyClass &mC)
    {
        cout << "In Peek" << mC.t << endl;
    }
     
    int main()
    {
        MyClass<int> myC(3);
     
        Peek(myC);
     
        return 0;
    }

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Réponse rapide avec un code pour illustrer ce que tu veux.
    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
    // g++ -Wall -Wextra -pedantic peek.cpp
     
    #include <iostream>
     
    // Forward declaration of MyClass class
    template <typename T>
    class MyClass;
     
    // Declaration of Peek function
    template <class T>
    void Peek(const MyClass<T> &mC);
     
    // Definition of MyClass class
    template <typename T>
    class MyClass
    {
    public:
    	MyClass(T aT) : t(aT) { }
     
    	void Show() {}
     
    	friend void Peek<T>(const MyClass<T> &mC);
     
    private:
    	T t;
    };
     
    // Definition of Peek function
    template <class T>
    void Peek(const MyClass<T> &mC)
    {
    	std::cout << "In Peek" << mC.t << std::endl;
    }
     
     
    // Program test
    int main()
    {
    	MyClass<int> myC(3);
     
    	Peek(myC);
     
    	return 0;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    Merci, ça marche.
    Je vais regarder en détail pour bien comprendre ce qui cloche avec mon code car ça semble être très proche au niveau de la grammaire.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    Ehonn,
    Je me permets de revenir vers toi car il me reste quand même une question. Si je mets la définition de la classe template MyClass dans un fichier .h séparé (avec un classique #include "MyClass.h" en tête du fichier Main), j'obtiens un "undefined reference to Peek" dans le main. J'imagine que c'est parce que la déclaration de la fonction friend doit être faite avant cette le la classe. Dans ce cas, quel moyen existe-t-il (si ça existe) de séparer Peek et MyClass dans deux fichiers distincts?

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    On peut séparer l'implémentation de MyClass et de Peek dans deux fichiers d'en-tête (car ce sont des templates) distincts.
    Mais pour déclarer Peek en friend, il faut quand même utiliser la forward declaration pour dire à Peek que la classe MyClass existe et déclarer (donner sa signature) Peek pour dire à classe MyClass que la fonction Peek existe.

    MyClass.hpp
    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
    #ifndef MYCLASS_HPP
    #define MYCLASS_HPP
     
    // Forward declaration of MyClass class
    template <typename T>
    class MyClass;
     
    // Declaration of Peek function
    template <class T>
    void Peek(const MyClass<T> &mC);
     
    // Definition of MyClass class
    template <typename T>
    class MyClass
    {
    public:
    	MyClass(T aT) : t(aT) { }
     
    	void Show() {}
     
    	friend void Peek<T>(const MyClass<T> &mC);
     
    private:
    	T t;
    };
     
    #endif
    Peek.hpp
    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 PEEK_HPP
    #define PEEK_HPP
     
    #include <iostream>
     
    #include "MyClass.hpp"
     
     
    // Definition of Peek function
    template <class T>
    void Peek(const MyClass<T> &mC)
    {
    	std::cout << "In Peek" << mC.t << std::endl;
    }
     
    #endif
    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
    14
    15
    // g++ -Wall -Wextra -pedantic main.cpp
     
    #include "MyClass.hpp"
    #include "Peek.hpp"
     
     
    // Program test
    int main()
    {
    	MyClass<int> myC(3);
     
    	Peek(myC);
     
    	return 0;
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 89
    Points : 50
    Points
    50
    Par défaut
    Merci!

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

Discussions similaires

  1. Avis sur un problème de "friend class template"
    Par metagoto dans le forum C++
    Réponses: 8
    Dernier message: 24/03/2010, 17h16
  2. friend surcharge classe template
    Par fridollin dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 21h37
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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