EDITAR: Siguiendo el comentario de Mike Seymour, reemplacé operator std::string() const;
con operator char *() const;
y modifiqué la implementación en consecuencia. Esto permite la conversión implícita, pero, por alguna razón, el operador largo sin signo tiene precedencia sobre el operador char *, lo que simplemente no se siente bien ... Además, no quiero exponer cosas C desagradables como char * fuera del clase, cuando tengo std :: string. Tengo la corazonada de que mi clase CustomizedInt necesita heredar de algunas cosas para poder soportar la función que deseo. ¿Podría alguien elaborar el comentario de Mike con respecto al std::basic_string
? No estoy seguro de haberlo entendido correctamente.Preferencia de operadores de conversión implícita C++
tengo este pedazo de código:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int() const;
operator std::string() const;
};
CustomizedInt::operator unsigned long int() const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string() const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
que imprime "operador Llamado unsigned long int; 123". Mis preguntas son las siguientes:
- Después de eliminar el operador unsigned long int, ¿por qué necesito convertir x a std :: string explícitamente? ¿Por qué no llama directamente al operador de conversión implícita (std :: string)?
- ¿Hay alguna documentación que explique qué moldes implícitos están permitidos y cuál es su orden de precedencia? Parece que si añado un operador entero sin signo de esta clase en conjunto con el operador entero largo sin signo, recibo un error de compilación sobre la ambigüedad para el operador < < ...
- Además, sé que la definición de un operador de este tipo puede ser mala práctica, pero no estoy seguro de entender completamente las advertencias asociadas. ¿Alguien podría describirlos? ¿Sería mejor práctica simplemente definir los métodos públicos ToUnsignedLongInt y ToString?
Esto está relacionado con: [Error de resolución de sobrecarga al transmitir un objeto a través de la conversión implícita a una cadena] (http://stackoverflow.com/questions/6677072/overload-resolution-failure-when-streaming-object-via-implicit-conversion -to-str) –
@Als: Vamos a tomarlo con calma ... No estoy preparado para bucear en las plantillas todavía :) –