2014-02-13 148 views
-1

我正在进行一项任务,我必须将程序拆分为.cpp和.h文件模块,并且出现奇怪的错误。在我的一个.cpp文件中,我有代码'string'/'cin'未在此范围内声明

#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 response;”行中将string替换为std::string,并且问题停止;除了我接着在下一行获得error: 'cin' was not declared in this scope。我有我的#include<string>,<iostream><fstream>,所以我很困惑,为什么它不工作。任何意见,如何解决这个问题,而不改变我的源代码,将不胜感激!

+0

ü可以尝试使用'命名空间std'的包括 –

+0

刚过@SakthiKumar“没有改变我的源代码” – hvd

+0

你已经找到了解决问题的正确方法,但是你拒绝那个解决方案。事实上,你拒绝任何*解决方案在你的问题。你接着要求什么? – hvd

回答

3

您需要添加

using namespace std; 

cinstring是根据标准的命名空间std,这是不一样的范围与main()体定义。

从技术上来说,关键字using意味着,只要你可以使用它。在这种情况下,这指的是std命名空间。因此,无论何时计算机遇到字符串,cout,cin,endl或其他任何内容,它都会将其读取为std::string,std::cout,std::cinstd::endl

当你不使用std命名空间,计算机将尝试调用stringcin就好像它是不是在一个命名空间中定义(在你的代码大部分功能)。由于它不存在,计算机试图调用一些不存在的东西!因此,发生错误。

有关更多信息和示例,请参阅here


注:通过这样做,你也应该知道它的缺点。查看Why is “using namespace std;” considered bad practice?了解更多信息。

更好的方法是,你可以把std::std::cinstd::string等前面显式地给出它们的命名空间。

+0

+1如果你让人看书 – nurettin

+0

这工作!我试图在其他地方查找,他们在那里说,问题是他们都“使用名称空间标准;”头部包含并且据说导致了问题。谢谢! – JC2112

+1

'使用命名空间标准;':通常不好的建议,除非你清楚地说明了陷阱。 – juanchopanza

0

所有这些在错误消息中指出的名称都是在标准名称空间std中声明的。因此,无论你应该这样的前缀名称以的std ::那就是使用合格的名称,例如

std::string response; 

,或者你应该说,这些不合格的名称将对应名称从标准命名空间,例如

编译
using std::string; 

或者你应该把所有的标准名称到全局命名空间,例如

using namespace std;