Почему вывод класса с оператором преобразования не работает для std :: string?

Это работает, печать 1:

#include <iostream>

struct Int {
    int i;
    operator int() const noexcept {return i;}
};

int main() {
    Int i;
    i.i = 1;
    std::cout << i;
}

Тем не мение,это не компилируется в GCC 4.8.1:

#include <iostream>
#include <string>

struct String {
    std::string s;
    operator std::string() const {return s;}
};

int main() {
    String s;
    s.s = "hi";
    std::cout << s;
}

Вот соответствующие части ошибки:

ошибка: нет совпадения для оператора «оператор <<» (типы операндов: «std :: ostream {aka std :: basic_ostream}» и «строка»)
std :: cout << s;

надрез

шаблон std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> &, const std :: basic_string <_CharT, _Traits, _Alloc> &)
оператор << (basic_ostream <_CharT, _Traits> & __os,

/usr/include/c++/4.8/bits/basic_string.h:2753:5: примечание: не удалось вывести / заменить аргумент шаблона:
main.cpp: 25: 18: примечание: «String» не является производным от «const std :: basic_string <_CharT, _Traits, _Alloc>»
std :: cout << s;

Я использую толькоstd::cout а такжеstd::string, которые имеют одинаковые аргументы шаблона. Я действительно не уверен, почему это не сможет подобрать неявное преобразование, как это было дляInt, Почему это работает сint, но нетstd::string?

Ответы на вопрос(2)

Ваш ответ на вопрос