Когда заголовок iostream заменяет другие заголовки, например, string?
iostream явно или еще через какой-то header включает string. Лучше всегда явно включать то, что вы используете. Так при модификации кода будет вылезать меньше ошибок.
Собирается - не нужно. Не собирается - нужно.