2011-07-25 3 views
3

Почему в приведенном ниже коде без включения заголовка «string» я могу объявить строковую переменную. Но компилятор жалуется только на cout, когда я пытаюсь напечатать строку.Почему строка заголовка требуется для cout?

Какая информация содержит заголовок «string»?

#include <iostream> 
//#include "string" 

int main() 
{ 
    std::string str="SomeWorld"; 

    std::cout<<str<<std::endl; 

    return 0; 
} 

ответ

12

Поскольку заголовок определения std::basic_string, скорее всего, (косвенно) включены <iostream> (std::string является ЬурейиМ на основе std::basic_string<char>). Перегрузка для operator<< для std::cout однако определена только в <string>.

+0

В случае Visual C++ '' включает в себя определяемый реализацией заголовок '', который определяет 'basic_string' сам, но, как вы говорите, он не определяет' operator << '. – Sven

2

Это не требуется для std::cout, это необходимо для std::string.

+0

++. без включения заголовка «string» я могу объявить std :: string variable. компилятор позволяет это сделать. – vrbilgi

+0

@user - разрешено для одного заголовка C++ включать любой другой заголовок. Вы не можете полагаться на это, потому что он варьируется от одного компилятора к другому. Вы всегда должны включать заголовки, которые вам нужны. –

+0

@ user430294: Вам всегда нужен заголовок, который документирован, чтобы содержать этот тип. Все остальное - материал реализации, а не то, на что вы можете положиться. –

0

<string> заголовок включает определение string класса (примечание: #include "string" означает включить string файл в текущем каталоге, так что вы должны использовать угловые скобки вместо " для системы включает в себя.)

Однако iostream уже включает в себя string (например, объявить operator<<, который работает для std::string), поэтому поэтому его не нужно включать в этом случае.

В любом случае, рекомендуется использовать заголовки, которые вам просто нужны. Это делает ваш код более портативным и более явным, если вы скопируете этот код в другой контекст, скажем, который не включает iostream в качестве предыдущего. Также обратите внимание, что никогда не указано, что, например, в том числе iostream будет делать std::string, так что, строго говоря, вы должны включить string для использования std::string.

-2

Потому что <string> включен в <iostream>. Вот почему компилятор не ублажает.

+0

Ответчик сообщает, что компилятор * делает жалобу. –

+0

Я думаю, что голосования было достаточно. – sap

2

Строго говоря, все может случиться, если вы не включите все правильные заголовки. Нет обязательного включения одного стандартного заголовка в любой другой. Таким образом, чтобы быть портативным и правильно, вы должны сказать:

#include <string> // for `std::string` 
#include <ostream> // for `std::ostream &` in `operator<<` 
#include <iostream> // for std::cout 

int main() { 
    std::string str = "hello world"; 
    std::cout << str << std::endl; 
} 

В любой реальной реализации вы почти всегда можете уйти с опуская некоторые из заголовков (например, ostream, вероятно, были включены в iostream), но выше стандартно.

Смежные вопросы