为什么我得到字符串没有命名类型错误?

时间:2011-04-03 04:54:25

标签: c++ string std

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

5 个答案:

答案 0 :(得分:88)

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

作为others have pointed out,标头中为not good practice - 包含该标头的每个人也会不自觉地点击using行并将std导入其名称空间;正确的解决方案是将这些行更改为使用std::string而不是

答案 1 :(得分:35)

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

不要using namespace std放入头文件中,它会污染该标头的所有用户的全局命名空间。另请参阅"Why is 'using namespace std;' considered a bad practice in 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 :(得分:6)

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

事实上,您应该将其用于istreamostream - 然后您需要在头文件顶部使用#include <iostream>以使其更加自包含。

答案 3 :(得分:5)

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

namespace中的game.cpp位于包含标题之后。

答案 4 :(得分: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