78 votes

Pourquoi est-ce que je reçois l'erreur "string does not name a type" ?

game.cpp

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

using namespace std;

game.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

110voto

Michael Mrozek Points 44120

Votre using La déclaration est dans game.cpp pas game.h où vous déclarez réellement des variables de type chaîne. Vous aviez l'intention de mettre using namespace std; dans l'en-tête, au-dessus des lignes qui utilisent la fonction string ce qui permettrait à ces lignes de trouver le string défini dans le std espace de noms.

Comme d'autres l'ont souligné c'est pas de bonne pratique dans les en-têtes -- tous ceux qui incluent cet en-tête seront aussi involontairement touchés par l'option using la ligne et l'importation std dans leur espace de nom ; la bonne solution est de changer ces lignes pour utiliser std::string au lieu de

10 votes

@Michael Mrozek, @Steven : Moving using namespace std; dans l'en-tête est un acte méprisable. Le conseiller l'est doublement !

2 votes

@Johnsyweb Personnellement, je déteste using namespace mais c'est clairement ce qu'il avait l'intention de faire.

4 votes

@Michael : Raison de plus pour le décourager !

46voto

Johnsyweb Points 45395

string ne donne pas le nom d'un type. La classe dans le string L'en-tête est appelé 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 nom global pour tous les utilisateurs de cet en-tête. Voir aussi "Pourquoi 'using namespace std;' est-il 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);
};

2 votes

@Jonhsyweb : +1 pour avoir souligné les dangers de using namespace

0 votes

Est-ce que #include <string> doit également être inclus dans le fichier d'en-tête en plus d'être inclus dans le fichier principal .cpp ?

0 votes

@Gnuey : Depuis #include <string> est nécessaire pour toute unité de compilation incluant cet en-tête, j'inclurais cette ligne, oui. Il n'est pas nécessaire de répéter cette directive dans tout fichier source ultérieur.

10voto

quamrana Points 6411

Il suffit d'utiliser le std:: devant l'expression string dans vos fichiers d'en-tête.

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

5voto

Borealid Points 35075

Essayez un using namespace std; au sommet de game.h ou utiliser le nom complet std::string au lieu de string .

El namespace en game.cpp est après l'inclusion de l'en-tête.

2voto

Crispen Gari Points 1262

Vous pouvez surmonter cette erreur de deux façons simples

Premier moyen

using namespace std;
include <string>
// then you can use string class the normal way

Deuxième voie

// after including the class string in your cpp file as follows
include <string>
/*Now when you are using a string class you have to put **std::** before you write 
string as follows*/
std::string name; // a string declaration

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X