3

質問のように、クラスで文字列演算子を定義すると:

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

  string toStr () const;
};

そして、私はそれを使用します:

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

明示的なキャストではすべてがうまくいきますが、(文字列) を削除すると、コンパイラは std::string で宣言されたキャスト演算子が必要であると言います。私のタイプを自動的にキャストするべきではありませんか? 解決済み: operator<< (ostream& os, const Literal& l) をオーバーロードしています。

4

2 に答える 2

10

いいえ.. std::string には、引数として Literal を取るコンストラクターが必要です。

あなたができることは、リテラルクラスの演算子 << をオーバーロードし、キャストしてそこのストリームに挿入することです。

ostream &operator <<(std::ostream &stream, const Literal &rhs)
{
    stream << (string) rhs;
    return stream;
}
于 2010-10-22T19:43:09.003 に答える
5

簡単な答え: キャストまたはを使用し続けるかtoStr()、独自の関数を記述しますoperator<<。(私はしたいl1.toStr()です(string)l1。)

長い答え: 標準ライブラリに関数がある場合、これは機能する可能性があります

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

それはほとんどですが、技術的にはそうではありません。ostreamとは両方とも、string実際にはテンプレートのインスタンス化の typedef です。そして、一方を他方に挿入するためのテンプレート機能があります。

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

そのためcout << str、 where の type strisstd::stringを使用すると、そのテンプレート関数を with で使用することがわかりますCharT = char

しかし、C++ では、同じ呼び出しでコンパイラに暗黙的な型変換 ( Literalto string) とテンプレート関数のテンプレート パラメーターの推定( )の両方を理解させることはできません。CharT = char

于 2010-10-22T20:14:34.870 に答える