Frage

Wie in der Frage, wenn ich einen String -Operator in meiner Klasse definiere:

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

  string toStr () const;
};

Und dann benutze ich es:

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

Mit einem expliziten Guss geht alles richtig, aber wenn ich die (Zeichenfolge) entferne, sagt der Compiler, dass ein Gussbetreiber in STD :: String deklariert wird. Sollte es meinen Typ nicht automatisch werfen? Gelöst: Ich überlastete Operator << (Ostream & OS, Const Literal & L).

War es hilfreich?

Lösung

Nein .. Std :: String müsste einen Konstruktor haben, der wörtlich als Argument betrachtete.

Was Sie tun können, ist Operator << für Ihre buchstäbliche Klasse und lassen Sie ihn dort in den Stream werfen und einfügen.

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

Andere Tipps

Kurze Antwort: Verwenden Sie weiterhin eine Besetzung oder toStr(), oder schreibe deine eigenen operator<< Funktion. (Ich würde bevorzugen l1.toStr() zu (string)l1.)

Lange Antwort: Dies könnte funktionieren, wenn die Standardbibliothek eine Funktion hatte

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

Was es fast tut, aber technisch nicht. Beide ostream und string sind wirklich typedefs von template -Instanziationen. Und es gibt eine Vorlagenfunktion, um eine in den anderen einzuführen.

// 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&);
}

Also, wenn Sie verwenden cout << str wo die Art von str ist std::string, Es kann herausfinden, dass diese Vorlagenfunktion mit Verwendung verwendet wird, mit CharT = char.

C ++ erlaubt Ihnen jedoch nicht, dass der Compiler sowohl einen impliziten Typumwandlungen herausfindet (Literal zu string) und Vorlagenvorlagenparameter abgeben (Parameter (CharT = char) auf demselben Anruf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top