Precedencia de los operadores de conversión implícita de C ++

EDIT: Siguiendo el comentario de Mike Seymour, reemplacéoperator std::string () const; conoperator char * () const; y cambió la implementación en consecuencia. Esto permite el lanzamiento implícito, pero, por alguna razón, el operador int largo sin firmar tiene prioridad 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 admitir la función que deseo. ¿Podría alguien por favor elaborar el comentario de Mike con respecto astd::basic_string? No estoy seguro de haberlo entendido bien.

Tengo este pedazo de código:

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

Lo que imprime "Operador llamado unsigned long int; 123". Mis preguntas son estas:

Después de eliminar el operador sin signo 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é conversiones implícitas están permitidas y cuál es su orden de prioridad? Parece que si agrego un operador sin signo int a esta clase junto con el operador unsigned long int, recibo un error de compilación sobre la ambigüedad del operador << ...Además, sé que la definición de un operador de este tipo puede ser una mala práctica, pero no estoy seguro de entender completamente las advertencias asociadas. ¿Alguien podría por favor delinearlos? ¿Sería una mejor práctica simplemente definir los métodos públicos ToUnsignedLongInt y ToString?

Respuestas a la pregunta(1)

Su respuesta a la pregunta