我正在执行一项任务,必须将程序拆分为.cpp和.h文件的模块,但我遇到了一个奇怪的错误。在我的一个.cpp文件中,我有代码
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
bool getYesNoResponse()
{
string response;
getline (cin, response);
while (response.size() == 0 ||
(response[0] != 'y' && response[0] != 'Y'
&& response[0] != 'n' && response[0] != 'N'))
{
if (response.size() > 0)
cout << "Please respond 'yes' or 'no'. " << flush;
getline (cin, response);
}
return response[0] == 'y' || response[0] == 'Y';
}
我得到错误error: 'string' was not declared in this scope
。我不应该编辑给我的实际代码(我们只应该在.h文件中编写includes和定义函数),但我想看看字符串问题是否只是一次性的,所以我在"string response;
"行中用std::string
替换了string
,问题就停止了;只是我得到了下一行的CCD_ 5。我有<string>
、<iostream>
和<fstream>
的#include
,所以我很困惑为什么它不起作用。任何关于如何在不更改我的源代码的情况下修复此问题的建议都将不胜感激!
您需要添加
using namespace std;
因为cin
和string
是在与main()
主体不在同一范围的标准名称空间std
下定义的。
从技术上讲,关键字using
的意思是,尽可能使用它。在本例中,这指的是std命名空间。因此,每当计算机遇到字符串、cout、cin、endl或任何类似的东西时,它都会将其读取为std::string
、std::cout
、std::cin
或std::endl
。
如果不使用std
命名空间,计算机将尝试调用string
或cin
,就好像它没有在命名空间中定义一样(就像代码中的大多数函数一样)。由于它在那里不存在,计算机试图调用不存在的东西!因此,出现了错误。
您可以参考这里了解更多信息和示例。
注意:这样做,您也应该知道它的缺点。看看为什么"使用命名空间std;"被认为是不好的做法?了解更多信息
更好的方法是,您可以像std::cin
、std::string
等一样将std::
放在前面,以显式地给出它们的名称空间。
using namespace std;
只需在开头包含头文件后添加上面的一行。
出现错误cin not declared in this scope
或'string'/'cin' was not declared in this scope
是因为C++
使用namespace
来防止函数名称相互冲突。命名空间为其内部声明的名称提供了一个单独的作用域,称为namespace scope
,一个全局作用域。因此,在命名空间范围内声明的任何名称都不会被误认为是其他范围中的类似名称。
错误消息中指出的所有这些名称都在标准名称空间std中声明。因此,您应该在这些名称前面加上std::,即使用限定名称,例如
std::string response;
或者你应该告诉编译器,这些不合格的名称将与标准名称空间中的名称相对应,例如
using std::string;
或者您应该将所有标准名称放入全局名称空间,例如
using namespace std;