Warum funktioniert die Ausgabe einer Klasse mit einem Konvertierungsoperator nicht für std :: string?
#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
?