2

这基于 GCC/G++,通常在 Ubuntu 上。

这是我完成的示例程序:

#include <iostream>

using namespace std;

int main()
{
    std::string c = "Test";
    cout << c;
    return 0;
}

上面的代码工作正常。

但是我有两个问题我不太明白......

  1. 将字符串声明编写为std:string(使用 one :)也可以正常工作。有什么不同?

  2. 如果我在一个类中使用std:string(with one :) 来声明一个私有变量,我会收到一个错误错误:'std' does not name a type。此声明的示例:

class KType
{
private:
    std:string N;
};

有人可以解释这些问题吗?非常感谢!

4

4 回答 4

14

将字符串声明编写为 std:string 也可以正常工作。有什么不同。

如果您以不同的方式格式化,差异会更明显:

std:
    string c = "Test";

您正在声明一个名为的标签std,并使用string已被转储到全局命名空间中的名称using namespace std;。将其正确编写为std::string,您使用的stringstd命名空间中的名称。

如果我std::string在一个类中使用它来声明一个私有变量,我会得到一个错误错误:‘std’ does not name a type.

那是因为您不能将标签放在类定义中,只能放在代码块中。你必须在std::string那里正确地写它。(如果类是在头文件中定义的,那么using namespace std这比在源文件中更糟糕,所以我敦促你不要这样做。)

此外,如果您正在使用std::string,那么您应该#include <string>. 由于引入<iostream>的定义超出了需要,您的代码看起来像是意外工作,但您不能便携地依赖它。

于 2013-04-20T12:38:21.683 回答
5

您需要包含字符串类头:

#include <string>

此代码有错字,缺少第二个冒号

std:string N;

应该:

std::string N;

使用单个冒号,它成为 goto 的标签,这可能不是您的意思。

于 2013-04-20T12:37:20.493 回答
3

第一个问题:

首先,您缺少#include <string>指令。您不能自动依赖其他标题(例如<iostream>)到#include标题<string>。除此之外:

第二个问题:

将字符串声明编写为 std:string 也可以正常工作。有什么不同。

那是因为您在全局命名空间范围内有一个(邪恶的)using指令:

using namespace std;

该指令的效果是将std命名空间中的所有名称都导入到全局命名空间中。这就是为什么完全合格std::string和不合格string会解析为同一类型的原因。

如果您省略了该指令,则在使用非限定名称using namespace std;时会出现编译器错误。string

第三个问题:

如果我在一个类中使用这个 std::string 来声明一个私有变量,我会得到一个错误错误:'std' 没有命名一个类型。此声明的示例:

您缺少一个冒号。那应该是:

std::string
//  ^

并不是

std:string
// ^
于 2013-04-20T12:38:20.357 回答
2

将字符串声明编写为 std:string 也可以正常工作。有什么不同。

没有区别,除非您声明其他名为string. 在您的代码中,stringstd::string引用相同的类型。using namespace std但不惜一切代价避免。

如果我在一个类中使用这个 std::string 来声明一个私有变量,我会得到一个错误错误:'std' 没有命名一个类型。此声明的示例:

您需要#include <string>才能使用std::string. 正在发生的事情是,在您的第一个代码示例中,<iostream>似乎包括<string>. 你不能依赖它。您必须包括<string>.

于 2013-04-20T12:38:05.340 回答