Pourquoi est-ce que string ne nomme pas une erreur de type?

le jeu.cpp

#include <iostream>
#include <string>
#include <sstream>
#include "game.h"
#include "board.h"
#include "piece.h"

using namespace std;

le jeu.h

#ifndef GAME_H
#define GAME_H
#include <string>

class Game
{
    private:
        string white;
        string black;
        string title;
    public:
        Game(istream&, ostream&);
        void display(colour, short);
};

#endif

l'erreur est:

game.h:8 error: 'string' does not name a type

game.h:9 error: 'string' does not name a type

51
demandé sur gsamaras 2011-04-03 08:54:24

4 réponses

votre déclaration using est dans game.cpp , pas game.h où vous déclarez réellement des variables de chaîne. Vous avez l'intention de mettre using namespace std; dans l'en-tête, au-dessus des lignes qui utilisent string , qui laisserait ces lignes trouver le type string défini dans l'espace de nom std .

comme d'autres ont souligné , c'est pas bonne pratique dans les en-têtes -- tous ceux qui comprennent que en-tête va aussi involontairement frapper la ligne using et importer std dans leur espace de nom; la bonne solution est de changer ces lignes à utiliser std::string à la place

80
répondu Michael Mrozek 2017-05-23 12:18:33

string ne désigne pas un type. La classe dans l'en-tête string s'appelle std::string .

s'il vous Plaît ne pas mettre using namespace std dans un fichier d'en-tête, il pollue l'espace de noms global pour tous les utilisateurs de cet en-tête. Voir aussi " Pourquoi 'utiliser namespace std;' considéré comme une mauvaise pratique en C++?"

Votre classe devrait ressembler à ceci:

#include <string>

class Game
{
    private:
        std::string white;
        std::string black;
        std::string title;
    public:
        Game(std::istream&, std::ostream&);
        void display(colour, short);
};
33
répondu Johnsyweb 2017-05-23 11:33:13

utilisez simplement le qualificatif std:: devant string dans vos fichiers d'en-tête.

En fait, vous devriez l'utiliser pour istream et ostream - et alors vous aurez besoin de #include <iostream> en haut de votre fichier d'en-tête afin de le rendre plus autonome.

6
répondu quamrana 2011-04-03 07:36:25

essayez un using namespace std; au haut de game.h ou utilisez le std::string au lieu de string .

Le namespace dans game.cpp est après l'en-tête est inclus.

3
répondu Borealid 2011-12-20 22:13:58