为什么我得到的字符串没有命名为Error?


71

game.cpp

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

using namespace std;

游戏

#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

Answers:


101

您的using声明位于中game.cpp,而不是game.h实际声明字符串变量的位置。您打算将using namespace std;标题放在use所在行的上方string,这将使这些行找到stringstd命名空间中定义的类型。

正如其他人指出的那样,在标头中并不是一种好习惯-包含该标头的每个人也会不由自主地进入该using行并导入std其名称空间;正确的解决方案是更改这些行以std::string代替


9
@Michael Mrozek,@ Steven:using namespace std;进入标头是一种卑鄙的行为。建议加倍,所以!
Johnsyweb

2
@Johnsyweb个人而言,我using namespace完全讨厌,但显然他打算这么做
Michael Mrozek

4
@迈克尔:更要劝阻他!
Johnsyweb

13
@Johnsyweb我讨厌在互联网上搜索某个问题,看到有人问同样的问题,而所有答案都是“不,请不要那样做”,我会回答所提出的问题。我应该提到这是一个坏主意,是的,但是我拒绝说“不,这是不可能的”
Michael Mrozek 2011年

2
@Michael:谢谢你的编辑。我讨厌在网上搜索问题的解决方案,只是发现最热门的东西是黑客。+1 :-)
Johnsyweb 2011年

40

string没有命名类型。string标头中的类称为std::string

不要放入using namespace 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);
};

2
@Jonhsyweb:+1指出了using namespace
Alok

#include <string>除了应该包含在主.cpp文件中之外,还应该包含在头文件中吗?
LazerSharks

@Gnuey:因为#include <string>包括该头文件的任何编译单元都需要,所以我要包括这一行。无需在任何后续源文件中重复此指令。
Johnsyweb

9

只需在头文件中使用std::限定符即可string

事实上,你应该用它来istreamostream也-然后你需要#include <iostream>在你的头文件的顶部,使之更加完善的设施。


6

尝试using namespace std;在顶部game.h使用或使用完全合格的std::string代替string

namespacegame.cpp是被包括在报头之后。


0

您可以通过两种简单的方法来克服此错误

第一种方式

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

第二种方式

// 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.