/ / Utiliser l'en-tête existant dans son propre en-tête - c ++

Utiliser l'en-tête existant dans son propre en-tête - c ++

J'essaye d'écrire le fichier d'en-tête. Je peux écrire des en-têtes simples comme add (int x, y) return x + y; . Mais quand j'ai essayé de devenir plus compliqué, Visual Studio a donné une erreur. Je suppose que l'erreur est liée à <fstream>. Ça se voit toujours

"erreur C2065:" fstream ": identifiant non déclaré".

La première ligne de mon fichier cpp est void get_int(fstream& stream, int offset) (sauf #include<fstream>) et la première définition du fichier .h est

#ifndef GET_H
#define GET_H

int get_int(fstream& stream, int offset);

#endif

Ça va comme ça. Quel est le problème avec ce code?

Réponses:

3 pour la réponse № 1

Vous devez faire ceci:

#ifndef GET_H
#define GET_H

#include <fstream>

int get_int(std::fstream& stream, int offset);

#endif

Remarquez le #include <fstream> et l'ajout std:: préfixe. La qualification est nécessaire car toutes les bibliothèques C ++ Standard ... choses ... sont définies dans cet espace de noms. Vous ne devriez pas ajouter un using namespace std; ou using std::fstream; dans un en-tête, car cela pollue l’espace de nom global et annule le but de l’existence de namespace std: les personnes, y compris votre en-tête, ne s’attendent pas à ce que des éléments soient importés dans l’espace de noms global, ce qui peut entrer en conflit avec les noms utilisés par d’autres.


2 pour la réponse № 2
#include <fstream>

doit également figurer dans votre fichier d’en-tête. Il entre dans l'unité de traduction incluse, mais il doit encore le voir, car lors de l'extension dans le fichier .cpp, il se termine au-dessus de #include de fstream. De cette façon, vous vous assurez que l’ordre n’affectera pas la compilation car des protections d’inclusion sont en place. Il ne tentera pas de l’étendre deux fois. Également, #pragma once sauve les chatons.

La raison pour laquelle vous commandez les mêmes erreurs est parce que votre en-tête manque "using std :: goeshere" etc.

Échantillon de code faisant suite aux commentaires (prévention de la pollution de l'espace de noms):

#ifndef GET_H
#define GET_H

#include <fstream>
using std::fstream;

int get_int(fstream& stream, int offset);

#endif

ou (#pragma une fois devrait être soutenu par tous les compilateurs décents)

#pragma once

#include <fstream>
using std::fstream;

int get_int(fstream& stream, int offset);