这是基于GCC / G ++,通常是在Ubuntu上。
这是我完成的示例程序:
#include <iostream>
using namespace std;
int main()
{
std::string c = "Test";
cout << c;
return 0;
}
上面的代码工作正常。
但我有两个问题我不太明白......
将字符串声明写为std:string
也可以正常工作。有什么区别。
如果我在一个类中使用此std::string
来声明私有变量,则会出现错误错误:'std'未命名类型。本声明的示例:
class KType { private: std:string N;
有人可以解释一下这些问题吗? 非常感谢!
答案 0 :(得分:12)
将字符串声明写为std:string也可以正常工作。有什么区别。
如果你采用不同的格式,差异会更加清晰:
std:
string c = "Test";
您声明了一个名为std
的标签,并使用string
转储到全局命名空间中的名称using namespace std;
。正确地将其写为std::string
,您正在使用string
命名空间中的std
名称。
如果我在一个类中使用此
std::string
来声明私有变量,则会出现错误错误:‘std’ does not name a type.
那是因为你不能在类定义中添加标签,只能在代码块中。您必须在std::string
处正确编写它。 (如果在标题中定义了类,那么using namespace std
比源文件更糟糕,所以我建议你不要这样做。)
此外,如果您使用的是std::string
,那么您应#include <string>
。由于<iostream>
引入的定义超出了所需的定义,您的代码看起来很偶然,但您无法依赖它。
答案 1 :(得分:5)
您需要包含字符串类标题:
#include <string>
此代码有拼写错误,缺少第二个冒号
std:string N;
应该是:
std::string N;
使用单个冒号,它会变成goto的标签,这可能不是你的意思。
答案 2 :(得分: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
// ^
答案 3 :(得分:2)
将字符串声明写为std:string也可以正常工作。有什么区别。
除非您声明名为string
的其他内容,否则没有区别。在您的代码中,string
和std::string
指的是相同的类型。但不惜一切代价避免using namespace std
。
如果我在一个类中使用这个std :: string来声明一个私有变量,我会收到一个错误错误:'std'没有命名一个类型。此声明的示例:
您需要#include <string>
才能使用std::string
。发生的事情是,在您的第一个代码示例中,<iostream>
似乎包括<string>
。你不能依赖它。您必须包含<string>
。