Bonjour, alors voici mon problème je ne comprend pas pourquoi j'ai cette erreur j'ai beau chercher je ne vois pas :
||=== Build: Debug in TPZFraction (compiler: GNU GCC Compiler) ===|
Y:\code\TP ZFraction\TPZFraction\ZFraction.h|11|error: 'std::ostream' has not been declared|
Y:\code\TP ZFraction\TPZFraction\ZFraction.cpp|20|error: prototype for 'void ZFraction::affiche(std::ostream&) const' does not match any in class 'ZFraction'|
Y:\code\TP ZFraction\TPZFraction\ZFraction.h|11|error: candidate is: void ZFraction::affiche(int&) const|
Ligne 1 : tu inclues ZFraction.h avant d'inclure <iostream> , ce qui fait qu' a la compilation de ZFraction.cpp, le compilateur analyse ZFraction.h alors qu'il ne connait pas encore <iostream>
Par principe, quand on écrit un fichier d'en-tête (comme ZFraction.h), on doit veiller à ce que l'ordre dans lequel on va inclure les différents fichiers n'aie aucune importance.
Dans le cas présent, c'est râpé, car, si tu inclus ZFraction.h avant iostream, le compilateur se plaindra de ne pas trouver le type std::ostream.
Il faudrait donc inclure le fichier <iostream> directement dans ZFraction.h.
Pas de bol le jeu des inclusions en cascade aidant (le fait que le contenu d'un fichier inclus dans un fichier d'en-tête soit copié, et ce de manière récursive) fait que cette seule inclusion correspond au fait de rajouter plus de 25 000 lignes (25 429, au dernier décompte sur ma machine, dans ma configuration particulière) dans n'importe quel fichier d'implémentation (les fichiers dont l'extension est .cpp) qui inclut ce fichier.
Or, ces 25 000 lignes devront être traitées par le compilateur, et ca prend un temps bête.
Par chance, ZFraction.h doit uniquement savoir que le type std::ostream (en fait, le type std::basic_ostream<char> pour être précis) existe. Lui n'a absolument aucun besoin d'accéder au contenu de ce type, ni de disposer de l'implémentation des fonctions que l'on retrouve dans iostream et dans d'autres fichiers (il n'y a que les fichiers d'implémentation ZFraction.cpp et main.cpp qui doive y accéder).
C'est la raison pour laquelle les développeur de la bibliothèque standard ont, dans leur très grande sagesse créé le fichier d'en-tête standard <iosfwd> qui permet au compilateur de savoir que tous les types que l'on retrouve dans <iostream> (et d'autres, comme <fstream>) existent et qui ne rajoute "que" 1570 lignes de code à peu près. Ce qui est quand même près de 20 fois moins que iostream, et qui est encore beaucoup moins si on décide d'inclure des fichiers comme <fstream> ou <sstream>.
Si bien que, en théorie, l'idéal serait:
d'inclure le fichier <iosfwd> dans le fichier d'en-tête (ZFraction.h)
d'inclure le fichier <iostream> dans le fichier d'implémentation qui en ont besoin, à savoir ZFraction.cpp (à cause de l'implémentation de la fonction membre ZFraction::affiche).
Et tant que l'on n'écrira pas un code proche de
int main(){
ZFraction a(9,10);
/* c'est cette ligne ci qui poserait problème */
std::cout<<a;
}
le fichier main.cpp n'aura même pas besoin de l'inclure non plus
Au passage: le cours sur ce site est obsolète et apprend un tas de conneries qui ont été débattues en long, en large et en travers sur le forum. Je te laisses le soin de faire une recherche pour savoir ce que j'entends par là, mais je te conseille vivement d'abandonner ce cours
- Edité par koala01 20 septembre 2017 à 14:59:08
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
merci pour vos conseil, cependant, malgré les quelques mauvaises habitudes que j'aurais pus prendre ne lisant se cours, je suppose que je n'aurais pas non plus besoin de tout réapprendre, mais juste de comprendre ces quelles sont ces mauvaises habitudes et m'en débarrassée ? Ce n'est pas comme si j'avais appris quelque chose de totalement faux non plus n'est ce pas ?
trés bien merci donc je suppose qu'il vaut mieux que je commence directement le cour que vous m'avez envoyez et que je relise les partie que j'ai déjà vu, sans avoir a forcement tout réapprendre. En tous cas merci de votre réponse.
Oui , je te conseille de lire le cours de gbdivers depuis le début, comme si tu apprenais le C++ pour la première fois. Le cours d'OC est vraiment très mauvais pour quiconque veuille apprendre le C++ 'moderne'
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr