Por que produzir uma classe com um operador de conversão não funciona para std :: string?
#include <iostream>
struct Int {
int i;
operator int() const noexcept {return i;}
};
int main() {
Int i;
i.i = 1;
std::cout << i;
}
Contudo,isso não consegue compilar no 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;
}
Aqui estão as partes relevantes do erro:
erro: nenhuma correspondência para "operador <<" (os tipos de operandos são "std :: ostream {aka std :: basic_ostream}" e "String")
std :: cout << s;
recorte
template std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> e, const std :: basic_string <_CharT, _Traits, _Alloc> &)
operador << (basic_ostream <_CharT, _Traits> & __os,
/usr/include/c++/4.8/bits/basic_string.h:2753:5: nota: dedução / substituição do argumento do modelo falhou:
main.cpp: 25: 18: note: "String" não é derivada de "const std :: basic_string <_CharT, _Traits, _Alloc>"
std :: cout << s;
Eu só usostd::cout
estd::string
, que possuem os mesmos argumentos de modelo. Eu realmente não tenho certeza porque isso não seria capaz de pegar a conversão implícita como ele fez paraInt
. Por que funciona comint
, mas nãostd::string
?