Почему строка заголовка требуется для cout? - PullRequest
3 голосов
/ 25 июля 2011

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

Из какой информации состоит заголовок "string"?

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

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

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

  return 0;
}

Ответы [ 5 ]

12 голосов
/ 25 июля 2011

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

2 голосов
/ 25 июля 2011

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

#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), но вышеприведенный способ соответствует стандарту.

2 голосов
/ 25 июля 2011

Не требуется для std::cout, требуется для std::string.

0 голосов
/ 25 июля 2011

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

0 голосов
/ 25 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...