0

すべての挿入操作を同封の ostringstream インスタンスに委譲する ostringstream インスタンスのシン ラッパーを作成しようとしています。アイデアは、カスケード挿入操作を行うときに型を保持することです。通常、カスケード挿入操作の結果の型は ostream& であり、元の型は失われます。さらに処理するためにメソッドに渡すことができるようにしたいので、式の型を維持したいと思います。挿入された文字列データを取得するために、基になる ostringstream にアクセスしたいと考えています。

次のようなことができて、式の結果が LgStream になるようにしたいと思います。

LgStream() << 26 << " a plain string " << std::string("a std string") << someObjWithItsOwnInsertionOperator;

そのため、基本的な型には operator<<() を定義し、その他すべてのキャッチオールとしてテンプレート メソッドを定義しました。

class LgStream
{
public:
    ostringstream m_oss;
    string str() {return m_oss.str();}

    LgStream &operator<<(int x) {m_oss << x; return *this;}
    LgStream &operator<<(long x) {m_oss << x; return *this;}
    LgStream &operator<<(char x) {m_oss << x; return *this;}
    LgStream &operator<<(bool x) {m_oss << (x ? 'T':'F'); return *this;}
    LgStream &operator<<(double x) {m_oss << x; return *this;}

    template <typename T>
    LgStream &operator<<(const T &x) {m_oss << x; return *this;}
    template <typename T>
    LgStream &operator<<(const T x) {m_oss << x; return *this;}

};

私はそれを正しく持っておらず、「あいまいな過負荷」エラーが発生しています。例えば:

LgStream() << "This is a plain string";

error: ambiguous overload for 'operator<<' in 'LgStream() << "This is a plain string"'
note: candidates are:
note: LgStream& LgStream::operator<<(int) <near match>
note:   no known conversion for argument 1 from 'const char [23]' to 'int' 
note: LgStream& LgStream::operator<<(long int) <near match>
note:   no known conversion for argument 1 from 'const char [23]' to 'long int'
note: LgStream& LgStream::operator<<(char) <near match>
note:   no known conversion for argument 1 from 'const char [23]' to 'char'

note: LgStream& LgStream::operator<<(bool)
note: LgStream& LgStream::operator<<(std::string)
note: LgStream& LgStream::operator<<(const T&) [with T = char [23], LgStream = LgStream]
note: LgStream& LgStream::operator<<(T) [with T = const char*, LgStream = LgStream]

いずれかの構文で、または間違ったアプローチを取っている場合は、どんな助けでも感謝します。

4

2 に答える 2

0

クラスを std::basic_ostringstream から派生させてみませんか? そうすれば、独自の挿入演算子を定義する必要がなくなり、すべての標準挿入演算子を使用できます。

参考文献では、STL クラスから派生させるのは危険であり、避けるのが最善であると書かれています。私の知る限り、これは、基本クラスを参照して派生クラスをポリモーフィックに使用する場合にのみ問題になります。説明すると、どの STL クラスも dtor を仮想として宣言していないため、ポリモーフィック オブジェクト ポインターを破棄しても、派生クラスの dtor が呼び出されず、メモリ リークが発生する可能性があります。このように LgStream を使用しない限り、問題ありません。

于 2013-01-28T06:25:49.023 に答える
0

あいまいさの主な原因は、2 つのテンプレート関数にあります。1 つは "const T &x" を取り、もう 1 つは "const T x" を取ります。すべての const T 値は、リファレンス バージョンにも適用されます。それらの1つを取り除きます。「operator<<(const T x)」の定義を削除した後、このコードを VC++ でコンパイルしたところ、エラーなしでコンパイルされました。おそらくあなたのコンパイラも同じことをするでしょう。

于 2013-01-28T08:38:15.860 に答える