2011-08-13 8 views
1

Possible Duplicates:
Why copying stringstream is not allowed?
how copy from one stringstream object to another in C++?ostringstream通報やコピーコンストラクタ

コンパイルクラスTは、Visual C++とGCCは、入出力ストリームテンプレートエラーを生成すると失敗します。ここでは、コードは次のとおりです。文字列にログデータメンバーの種類を変更する

#include <sstream> 

class T 
{ 
    static T copy; 

    std::ostringstream log; 

    T()   {} 
    T(const T& t) {log = t.log;} 
    ~T()   {copy = *this;} 
}; 

T T::copy; 

は、それがコンパイルし、[OK]を実行します。これは正当な行動ですか?

答えて

3

C++でストリームクラスのコピーコンストラクタとコピー割り当てが行われましたprivate

std::ostringstream ss; 

std::ostringstream ss1(ss); //not allowed - copy-constructor is private 
ss1=ss; //not allowed - copy-assignment is private 
+0

OK、それは本当だが、私も空のコピーコンストラクタと同じエラーを取得しています: 'T(のconst T&T){}' –

+0

@Paul:ポスト実際のコード、およびエラー。 – Nawaz

+0

@Nawasz:コピーコンストラクタを次のように置き換えて、上記の質問と同じです。 'T(const T&t){}'または 'T(const T&t){log << t.log.str();}'または 'T(const T&t){log << t.log.rdbuf();}'となります。私はいつも得ています:_std :: basic_ios <_Elem、_Traits> :: operator = ':仮想ベースで宣言されたプライベートメンバーへのアクセス可能なパスはありません' std :: basic_ios <_Elem、_Traits> '_ –

1

だと思います。ostringstreamには、オーバーロードされた代入(=)演算子がありません。

3

std::ostringstreamあなたがエラーを取得している理由ですコピーできません:それは意味、あなたはstd::ostringstreamオブジェクトのコピーを作成することはできません。この問題を解決する方法の詳細については、this answerを参照してください。

T(const T& t) {log << t.log.rdbuf(); } 
+0

'std :: basic_ios <_Elem、_Traits> :: operator =':仮想ベースで宣言されたプライベートメンバーへのアクセス可能なパスがありません 'std :: basic_ios <_Elem、_Traits>' –