Pierwszeństwo C ++ Implicit Conversion Operators

EDYCJA: Po komentarzu Mike'a Seymoura zastąpiłemoperator std::string () const; zoperator char * () const; i odpowiednio zmienił implementację. Pozwala to na niejawne rzutowanie, ale z jakiegoś powodu operator unsigned long int ma pierwszeństwo przed operatorem char *, który po prostu nie czuje się dobrze ... Ponadto nie chcę ujawniać nieprzyjemnych rzeczy typu C, takich jak char * poza klasa, gdy mam std :: string. Mam przeczucie, że moja klasa CustomizedInt musi dziedziczyć z niektórych rzeczy, aby obsługiwać pożądaną funkcję. Czy ktoś mógłby opracować komentarz Mike'a dotyczącystd::basic_string? Nie jestem pewien, czy właściwie to zrozumiałem.

Mam ten fragment kodu:

<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>

Które wypisuje „Called operator unsigned long int; 123”. Moje pytania to:

Po usunięciu operatora unsigned long int, dlaczego muszę rzucać x do jawnie std :: string? Dlaczego nie wywołuje bezpośrednio niejawnego operatora rzutowania (std :: string)?Czy jest jakaś dokumentacja wyjaśniająca, które niejawne obsady są dozwolone i jaka jest ich kolejność? Wydaje się, że jeśli dodam operatora unsigned int do tej klasy razem z operatorem unsigned long int, otrzymam błąd kompilatora o niejednoznaczności dla operatora << ...Wiem też, że zdefiniowanie takiego operatora może być kiepską praktyką, ale nie jestem pewien, czy w pełni rozumiem związane z tym zastrzeżenia. Czy ktoś mógłby je opisać? Czy byłoby lepiej zdefiniować metody publiczne ToUnsignedLongInt i ToString?

questionAnswers(1)

yourAnswerToTheQuestion