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

SL & STL C++ Discussion :

ISO C++ forbids declaration of `ostream' with no type.


Sujet :

SL & STL C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut ISO C++ forbids declaration of `ostream' with no type.
    Bonjour,

    Je suis débutant en C++.
    A la fac, on travaille sur Visual C++ 6, et voici un bout de code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      friend ostream& operator << (ostream&, const Date&);
      friend istream& operator >> (istream&, Date&);
    .

    Mais quand j'essaie de compiler ça chez moi, sous Linux avec la commande g++, j'obtiens le message suivant :
    Citation Envoyé par g++
    In file included from Date.cpp:1:
    Date.h:32: error: ISO C++ forbids declaration of `ostream' with no type
    Date.h:32: error: `ostream' is neither function nor member function; cannot be
    declared friend
    Date.h:32: error: parse error before `&' token
    .

    Quelqu'un pourrait-il m'expliquer d'où vient ce problème ?
    Merci d'avance.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Points : 36
    Points
    36
    Par défaut
    Pourrais-tu poster ton date.h

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Février 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    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 DATE_H
    #define DATE_H
     
    class Date{
     
     public:
     
      // constructeurs
      Date();
      Date(int, int, int);
     
      int get_jour();
      int get_mois();
      int get_annee();
     
      void set_jour(int);
      void set_mois(int);
      void set_annee(int);
     
      void saisir_date();
      void editer_date();
      void afficher_date();
     
      bool operator < (Date d);
      bool operator > (Date d);
     
      bool bissextile(int);
      int nb_01_01();
      int difference(Date d);
      int nb_jour_annee(Date d2);
     
      friend ostream& operator << (ostream&, const Date&);
      friend istream& operator >> (istream&, Date&);
     
      ~Date();
     
     private:
     
      int jour;
      int mois;
      int annee;
     
    };
     
    #endif // DATE_H

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Février 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ah je viens de comprendre qu'il fallait mettre ceci au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <iostream>
    using namespace std;
    .

    Je croyais qu'il ne fallait le mettre que dans Date.cpp.

    Maintenant ça fonctionne.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il faut éviter les using namespace dans les .h.

    Le mieux est alors de mettre partout dans le .h std::ostream au lieu de ostream.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Février 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour le conseil.

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Il faut éviter les using namespace dans les .h.

    Le mieux est alors de mettre partout dans le .h std::ostream au lieu de ostream.
    J'imagine que c'est pour un problème de collision.

    Pourrais- tu s'il te plaît me donner un cas concret ou ça peut poser problème? Merci.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Le but des namespaces est d'éviter les conflits de noms entre bibliothèques différentes.

    Imagine qu'un client souhaites utiliser ton code ainsi qu'une autre bibliothèque, et que cette bibliothèque utilise un toto::ostream qui soit différent de std::ostream.

    Si cette bibliothèque fait aussi usage de using dans les .h, notre pauvre utilisateur qui essaie d'inclure un fichier à toi et un fichier de l'autre bibliothèque se trouve embêté, car, par exemple s'il a inclu la bibliothèque en premier, ton .h ne pourra plus compiler suite à un conflit.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    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 : 39
    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
    [mode Luc]
    Pour ostream et istream, il vaut mieux inclure <ostream> et <istream> que <iostream>
    [/mode Luc]

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Merci JolyLoic pout ta réponse.

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/10/2011, 13h35
  2. Réponses: 14
    Dernier message: 19/07/2011, 14h43
  3. ISO C++ forbids declaration of 'Point with no type'
    Par fab87 dans le forum Débuter
    Réponses: 2
    Dernier message: 13/05/2011, 08h58
  4. ISO C++ forbids declaration of SHA1
    Par ikuzar dans le forum Débuter
    Réponses: 6
    Dernier message: 21/02/2011, 11h42
  5. ISO C++ forbids declaration
    Par inddzen dans le forum C++
    Réponses: 17
    Dernier message: 20/01/2008, 18h23

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