Почему я получаю строку без имени типа Ошибка? - PullRequest
61 голосов
/ 03 апреля 2011

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

Ошибка:

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

Ответы [ 4 ]

89 голосов
/ 03 апреля 2011

Ваше объявление using находится в game.cpp, а не game.h, где вы фактически объявляете строковые переменные. Вы намеревались поместить using namespace std; в заголовок над строками, использующими string, что позволило бы этим строкам найти тип string, определенный в пространстве имен std.

Как отметили другие , это не очень хорошая практика в заголовках - каждый, кто включает этот заголовок, также невольно попадет на строку using и импортирует std в их пространство имен; правильное решение состоит в том, чтобы изменить эти строки, чтобы использовать std::string вместо

35 голосов
/ 03 апреля 2011

string не называет тип.Класс в заголовке string называется std::string.

Пожалуйста, не помещайте using namespace std в файл заголовка, он загрязняет глобальное пространство имен для всех пользователей этого заголовка.См. Также "Почему 'используется пространство имен std;'считается плохой практикой в ​​C ++? "

Ваш класс должен выглядеть следующим образом:

#include <string>

class Game
{
    private:
        std::string white;
        std::string black;
        std::string title;
    public:
        Game(std::istream&, std::ostream&);
        void display(colour, short);
};
6 голосов
/ 03 апреля 2011

Просто используйте квалификатор std:: перед string в заголовочных файлах.

Фактически, вы должны использовать его также для istream и ostream - и тогда вам понадобится #include <iostream> вверху заголовочного файла, чтобы сделать его более автономным.

5 голосов
/ 03 апреля 2011

Попробуйте using namespace std; в верхней части game.h или используйте полностью квалифицированный std::string вместо string.

namespace в game.cpp - после включения заголовка.

...