web-dev-qa-db-ja.com

なぜ文字列はタイプエラーではないのですか?

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

63
Steven

using宣言は、実際に文字列変数を宣言するgame.cppではなく、game.hにあります。 stringを使用する行の上にあるヘッダーにusing namespace std;を配置することで、string名前空間で定義されているstd型を見つけることができます。

他の人が指摘している のように、これは 良い習慣ではありません ヘッダーにあります-そのヘッダーを含むすべての人は、無意識にusing行をヒットし、stdを名前空間にインポートします;適切な解決策は、代わりにstd::stringを使用するようにこれらの行を変更することです

91
Michael Mrozek

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);
};
36
Johnsyweb

ヘッダーファイルのstringの前にstd::修飾子を使用するだけです。

実際、istreamおよびostreamにも使用する必要があります。ヘッダーファイルの最上部に#include <iostream>が必要です。

6
quamrana

using namespace std;の上部にあるgame.hを試すか、stringの代わりに完全修飾std::stringを使用します。

game.cppnamespaceは、ヘッダーが含まれた後です。

5
Borealid