4

我知道这是一个非常荒谬的问题,但这非常令人困惑和恼火,因为本来应该起作用的东西却不是。我正在将代码块与 GCC 编译器一起使用,并且我试图在我的类中简单地创建一个字符串变量

#ifndef ALIEN_LANGUAGE
#define ALIEN_LANGUAGE

#include <string>

class Language
{
    public:

    private:
        string str;
};

#endif

奇怪的是,我的编译器让我停下来,并说这样的错误:

C:\Documents and Settings\...|11|error: `string' does not name a type|
||=== Build finished: 1 errors, 0 warnings ===|

由于某种原因,它无法找到“字符串”类,由于某种原因,我的 main.cpp 能够检测到“#include”,而我的语言类由于某种原因无法检测到。

这是我快速写的 main 只是为了看到它 main 本身能够看到字符串文件:

//main.cpp

#include <iostream>
#include <string>
#include "alien_language.h"

using namespace std;

int main()
{
    string str;

    return 0;
}

有谁知道发生了什么?

4

6 回答 6

11

using namespace std;

这就是正在发生的事情。

您没有std::在类中为字符串添加前缀。标准库中的所有内容都在命名空间中std

顺便说一句,通常认为使用 是不好using namespace std;的做法。有关为什么以及如何做的更多信息,请查看这个问题:使用 std 命名空间

于 2009-09-03T06:58:30.763 回答
7

字符串类在 std 命名空间中定义。您应该将课程改为:

class Language
{
    public:

    private:
        std::string str;
};

也可以,但不建议将其添加到头文件的顶部:

using namespace std;
于 2009-09-03T06:59:32.087 回答
6

string 在命名空间 std 中,您需要在头文件中完全限定它:

#include <string>

class Language
{
    public:

    private:
        std::string str;
};

不要using namespace std;在头文件中使用或类似。

于 2009-09-03T06:59:18.483 回答
2

您应该将其称为 std::string;

于 2009-09-03T06:59:53.553 回答
1

在我看来,您好像错过了最重要的(带有一丝讽刺意味)的using namespace std;行。要么在你的课之前添加它,要么明确地使用std::string str. 我建议不要using namespace std;在头文件中添加该行,因为它会污染包含它的任何文件的主空间。

于 2009-09-03T06:59:34.897 回答
0

标准 C++ 中的string类位于std命名空间中。在你的标题中写一些类似 的东西using std::string;,或者在你的标题中将它完全限定为 std::string 。

请注意,using namespace std;在标头中是一种不好的做法(请阅读此处)。

于 2009-09-03T06:59:46.113 回答