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?