MODIFICA: seguendo il commento di Mike Seymour, ho sostituito operator std::string() const;
con operator char *() const;
e modificato di conseguenza l'implementazione. Ciò consente il cast implicito, ma, per qualche ragione, l'operatore long int unsigned ha la precedenza sull'operatore char *, che non sembra giusto ... Inoltre, non voglio esporre roba C cattiva come char * al di fuori del classe, quando ho std :: string. Ho la sensazione che la mia classe CustomizedInt debba ereditare da alcune cose per supportare la funzione che desidero. Qualcuno potrebbe elaborare il commento di Mike riguardo a std::basic_string
? Non sono sicuro di averlo capito bene.Operatori di conversione implicita C++ Precedenza
ho questo pezzo di codice:
#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;
}
che stampa "operatore Chiamato unsigned long int; 123". Le mie domande sono queste:
- Dopo aver rimosso l'operatore unsigned long int, perché devo eseguire il cast x su std :: string in modo esplicito? Perché non chiama direttamente l'operatore di cast implicito (std :: string)?
- C'è qualche documentazione che spiega quali sono i cast impliciti ammessi e quale è il loro ordine di precedenza? Sembra che se aggiungo un operatore unsigned int a questa classe insieme all'operatore unsigned long int, ricevo un errore del compilatore relativo all'ambiguità per l'operatore < < ...
- Inoltre, so che la definizione di un simile operatore può essere cattiva pratica, ma non sono sicuro di comprendere appieno i caveat associati. Qualcuno potrebbe descriverli per favore? Sarebbe una pratica migliore definire solo i metodi pubblici ToUnsignedLongInt e ToString?
Questo è relativo: [Errore di risoluzione di sovraccarico durante lo streaming dell'oggetto tramite conversione implicita in stringa] (http://stackoverflow.com/questions/6677072/overload-resolution-failure-when-streaming-object-via-implicit-conversion -to-str) –
@Als: Facciamolo piano ... Non sono ancora pronto ad immergermi nei template :) –