2014-02-13 1 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 на std::string в строке «string response;», и проблема прекратилась; кроме того, я получил error: 'cin' was not declared in this scope со следующей строкой. У меня есть #include для <string>, <iostream> и <fstream>, поэтому я довольно смущен, почему он не работает. Любые советы о том, как исправить это, не изменяя мой исходный код, будут оценены!

+0

может у попробовать 'с помощью пространства имен std' только после того, включает –

+0

@SakthiKumar «без изменения моего исходного кода» – hvd

+0

Вы уже нашли правильный способ решения проблемы, но отвергаете это решение. Фактически, вы отклоняете * любое * решение в своем вопросе. Что вы тогда просите? – hvd

ответ

3

Вам нужно добавить

using namespace std; 

в cin и string определены в стандартном пространстве имен std, который не является тем же сфера с main() тела.

Ключевое слово using технически означает, используйте это, когда можете. В этом случае это относится к пространству имен std. Поэтому всякий раз, когда компьютер сталкивается с строкой, cout, cin, endl или что-то в этом роде, он будет считать это std::string, std::cout, std::cin или std::endl.

Когда вы не используете std имен, компьютер будет пытаться вызвать string или cin, как если бы он не был определен в пространстве имен (как и большинство функций в ваших кодах). Поскольку он там не существует, компьютер пытается называть то, чего не существует! Следовательно, возникает ошибка.

Для получения дополнительной информации и примеров вы можете обратиться к here.


Примечание:, делая это, вы также должны знать свои недостатки. За дополнительной информацией обращайтесь к Why is “using namespace std;” considered bad practice?.

Лучший способ является то, что вы можете положить std:: фронт как std::cin, std::string и т.д. явно дать их имен.

+0

+1 если вы соблазняете человека читать книгу – nurettin

+0

Это сработало! Я попытался найти это где-то в другом месте, и они сказали, что проблема в том, что они оба использовали «namespace std»; и заголовок включает, и это предположительно вызвало проблему. Благодаря! – JC2112

+1

'using namespace std;': Как правило, плохой совет, если вы не ясно изложите ловушки. – juanchopanza

0

Все эти имена, указанные в сообщениях об ошибках, объявляются в стандартном пространстве имен std.Так что либо вы должны префикс таких имен с станд :: то есть использовать квалифицированные имена, как, например

std::string response; 

или вы должны сказать, компилятор, что эти неквалифицированные имена соответствуют именам из стандартного пространства имен, как, например

using std::string; 

или вы должны поместить все стандартные имена в глобальное пространство имен, как, например

using namespace std; 
Смежные вопросы