Warum funktioniert die Ausgabe einer Klasse mit einem Konvertierungsoperator nicht für std :: string?

Dies funktioniert, Drucken 1:

#include <iostream>

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

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

Jedoch,Dies kann unter GCC 4.8.1 nicht kompiliert werden:

#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;
}

Hier sind die relevanten Teile des Fehlers:

Fehler: Keine Übereinstimmung für "Operator <<" (Operandentypen sind "std :: ostream {aka std :: basic_ostream}" und "String")
std :: cout << s;

schnipp

template std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> &, const std :: basic_string <_CharT, _Traits, _Alloc> &)
operator << (basic_ostream <_CharT, _Traits> & __os,

/usr/include/c++/4.8/bits/basic_string.h:2753:5: Hinweis: Der Abzug / die Ersetzung von Vorlagenargumenten ist fehlgeschlagen:
main.cpp: 25: 18: Hinweis: "String" ist nicht abgeleitet von "const std :: basic_string <_CharT, _Traits, _Alloc>".
std :: cout << s;

Ich benutze nurstd::cout undstd::string, die die gleichen Template-Argumente haben. Ich bin mir wirklich nicht sicher, warum dies nicht in der Lage sein würde, die implizite Konvertierung wie für aufzunehmenInt. Warum funktioniert es mitint, aber nichtstd::string?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage