'string'/'cin'未在此范围内声明

时间:2014-02-13 14:45:35

标签: c++

我正在进行一项任务,我必须将程序拆分为.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文件中定义函数),但我想看看字符串问题是否是一次性的事情,所以我在“string”行中将std::string替换为string response;,问题就停止了;除了我然后用下一行error: 'cin' was not declared in this scope。我有#include <string><iostream><fstream>,所以我很困惑为什么它不起作用。如果在不改变我的源代码的情况下解决这个问题的任何建议将不胜感激!

3 个答案:

答案 0 :(得分:3)

您需要添加

using namespace std;

由于cinstring是在标准名称空间std下定义的,这与main()正文的范围不同。

关键字using在技术上意味着,只要有可能就使用它。在这种情况下,这指的是std命名空间。因此,只要计算机遇到字符串,cout,cin,endl或任何相关内容,它就会将其读作std::stringstd::coutstd::cinstd::endl

当您不使用std命名空间时,计算机将尝试调用stringcin,就像它没有在命名空间中定义一样(因为您的大部分功能都是如此)码)。由于它不存在,计算机会尝试调用不存在的东西!因此,会发生错误。

您可以参考here了解更多信息和示例。


注意: 这样做,你也应该知道它的缺点。查看Why is “using namespace std;” considered bad practice?了解详情。

更好的方法是,您可以将std::放在std::cinstd::string等前面,以明确指定其名称空间。

答案 1 :(得分:1)

using namespace std; 

只需在开始包含头文件之后添加以上行即可。

出现错误cin not declared in this scope'string'/'cin' was not declared in this scope是因为C++使用namespace来防止函数名相互冲突。命名空间为内部声明的名称提供了一个单独的范围,称为namespace scope(一个全局范围)。因此,在命名空间范围内声明的任何名称都不会被误认为其他范围内的相似名称。

答案 2 :(得分:0)

错误消息中指出的所有这些名称都在标准名称空间std中声明。所以要么你应该用std ::这样的名字作为前缀,即使用限定名称,例如

std::string response;

或者您应该说编译器这些非限定名称将与标准名称空间中的名称相对应,例如

using std::string;

或者您应该将所有标准名称放在全局命名空间中,例如

using namespace std;