Considere el siguiente código.¿Por qué el compilador no realiza una conversión de tipo?
#include <iostream>
#include <string>
struct SimpleStruct
{
operator std::string() { return value; }
std::string value;
};
int main()
{
std::string s; // An empty string.
SimpleStruct x; // x.value constructed as an empty string.
bool less = s < x; // Error here.
return 0;
}
Este código no se compila ni en g ++ ni en Microsoft Visual C++. El informe de error dado por los compiladores es no match for operator '<' in 's < x'
. La pregunta es por qué el compilador no simplemente convierte el SimpleStruct x
en string
según el operator string()
dado y luego usa operator < (string, string)
?
+1, esta respuesta es correcta. 'string :: operator <()' no toma el argumento como 'const string &', pero 'basic_string <>'; si sobrecarga 'operator '' globalmente, entonces funciona. http://www.ideone.com/vMERa – iammilind
Eh, 'std :: string' es solo un typedef para' std :: basic_string '. 'typedef' no introduce un nuevo tipo, y por lo tanto no afecta a la sobrecarga. –
MSalters
El problema subyacente es que la deducción de 'charT' en' plantilla bool operator <(std :: basic_string const & lhs, std :: basic_string const & rhs); 'falla. No hay' charT' para el cual 'basic_string ' _equals_ 'SimpleStruct'. Eso lo elimina del conjunto de sobrecarga. –
MSalters