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 :

Amitié entre une classe générique et une surcharge de l'opérateur d'extraction de flux


Sujet :

C++

  1. #1
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut Amitié entre une classe générique et une surcharge de l'opérateur d'extraction de flux
    Bonjour,

    je cherche à déclarer une relation d'amitié entre une classe générique (template) et une surcharge de l'opérateur d'extraction de flux (operator>>) mais j'obtiens une erreur.

    J'ai l'habitude des relations d'amitié entre une classe générique et une surcharge de l'opérateur d'insertion de flux (operator<<) :

    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
    #ifndef FOO_HPP
    #define FOO_HPP
     
    #include <ostream>
     
    template<class T>
    class Foo;
     
    template<class T>
    std::ostream & operator<<(std::ostream &, Foo<T> const &);
     
    template<class T>
    class Foo
    {
      friend std::ostream & operator<< <>(std::ostream &, Foo const &);
     
    public:
      Foo(T const & value)
      :value_(value)
      {}
     
    private:
      T value_;
    };
     
    template<class T>
    std::ostream & operator<<(std::ostream & os, Foo<T> const & bar)
    {
      os << bar.value_;
      return os;
    }
     
    #endif
    Ce code fonctionne très bien sur ma machine et la fonction principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "foo.hpp"
     
    #include <iostream>
     
    int main()
    {
      Foo<double> foo(3.14);
      std::cout << foo << std::endl;
     
      return 0;
    }
    affiche bien 3.14.

    En revanche, si je tente de faire la même chose avec l'opérateur d'extraction, comme dans
    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
    #ifndef FOO_HPP
    #define FOO_HPP
     
    #include <istream>
    #include <ostream>
     
    template<class T>
    class Foo;
     
    template<class T>
    std::istream & operator>>(std::istream &, Foo<T> &);
     
    template<class T>
    std::ostream & operator<<(std::ostream &, Foo<T> const &);
     
    template<class T>
    class Foo
    {
      friend std::istream & operator<< <>(std::istream &, Foo &);
      friend std::ostream & operator<< <>(std::ostream &, Foo const &);
     
    public:
      Foo(T const & value)
      :value_(value)
      {}
     
    private:
      T value_;
    };
     
    template<class T>
    std::ostream & operator<<(std::ostream & os, Foo<T> const & bar)
    {
      os << bar.value_;
      return os;
    }
     
    template<class T>
    std::istream & operator>>(std::istream & is, Foo<T> & bar)
    {
      is >> bar.value_;
      return is;
    }
     
    #endif
    j'obtiens l'erreur de compilation suivante avec g++ :
    In file included from main.cpp:2:0:
    foo.hpp: In instantiation of ‘Foo<double>’:
    main.cpp:8:18: instantiated from here
    foo.hpp:19:25: erreur: template-id ‘operator<< <>’ for ‘std::istream& operator<<(std::istream&, Foo<double>&)’ does not match any template declaration
    Quelqu'un peut-il m'expliquer pourquoi?

    D'avance, merci beaucoup!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Le problème est résolu!
    Il y avait une erreur typographique!
    Désolé pour le dérangement!

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/01/2013, 13h15
  2. [Débutant] Une classe générique dans une liste
    Par sou_dj dans le forum C#
    Réponses: 4
    Dernier message: 14/06/2011, 17h24
  3. Réponses: 2
    Dernier message: 07/12/2009, 16h50
  4. Réponses: 7
    Dernier message: 25/08/2008, 16h13
  5. Réponses: 8
    Dernier message: 20/07/2007, 14h28

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