Domanda

Come nella domanda, se mi definisco un operatore di stringa nella mia classe:

class Literal {
  operator string const () {
    return toStr ();
  };

  string toStr () const;
};

e poi lo uso:

Literal l1 ("fa-2bd2bc3e0");
cout << (string)l1 << " Declared" << endl;

con un cast tutto esplicito va a destra, ma se mi tolgo la (stringa) il compilatore dice che ha bisogno di un operatore di cast dichiarata in std :: string. Non dovrebbe lanciare il mio tipo automaticamente? RISOLTO:. Sto sovraccarico operatore << (ostream & os, const letterale & l)

È stato utile?

Soluzione

No .. std :: string avrebbe dovuto avere un costruttore che ha avuto come argomento letterale.

Che cosa si potrebbe fare è operatore di sovraccarica << per la classe letterale e lo hanno gettato e l'inserto nel flusso in là.

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}

Altri suggerimenti

Risposta breve: Continua a utilizzare un cast o toStr(), o scrivere la propria funzione operator<<. (Io preferirei l1.toStr() a (string)l1.)

Risposta lunga: Questo lavoro potrebbe se la libreria standard aveva una funzione

std::ostream& operator<<( std::ostream&, std::string const& );

Il che quasi lo fa, ma non tecnicamente. Sia ostream e string sono davvero typedef di istanze di modello. E c'è una funzione di modello per l'inserimento di uno dentro l'altro.

// This is somewhat simplified.  For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
  typedef basic_string<char> string;
  typedef basic_ostream<char> ostream;

  template <typename CharT>
  basic_ostream<CharT>& operator<<(
    basic_ostream<CharT>&, 
    basic_string<CharT> const&);
}

Quindi, quando si utilizza cout << str dove il tipo di str è std::string, si può capire per utilizzare tale funzione del modello, con CharT = char.

Ma C ++ non permette di avere la cifra compilatore fuori sia una conversione di tipo implicita (Literal a string) e parametri di modello funzione modello dedurre (CharT = char) sulla stessa chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top