2014-02-13 149 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;