0

boostlog ライブラリを使用して、マルチスレッド ロギングに使用するログ ファイルへのアクセスを保護したいと考えていました。

このストリームクラスを試しました

class ThreadSafeStream
{
public:
    template <typename TInput>
    const ThreadSafeStream& operator<< (const TInput &tInput) const
    {
         // some thread safe file access    
         return *this;
    }
};

このように使用します (text_sink は boostlog オブジェクトです):

    //...
m_spSink.reset(new text_sink); 
text_sink::locked_backend_ptr pBackend = m_spSink->locked_backend();

const boost::shared_ptr< ThreadSafeStream >& spFileStream = boost::make_shared<ThreadSafeStream>();

pBackend->add_stream(spFileStream); // this causes the compilation error

そして、私はこの不思議なエラーを受け取ります:cannot convert from 'const boost::shared_ptr<T>' to 'const boost::shared_ptr<T>'

全体のコンパイル エラー:

Log.cpp(79): error C2664: 'boost::log2_mt_nt5::sinks::basic_text_ostream_backend<CharT>::add_stream' : cannot convert parameter 1 from 'const boost::shared_ptr<T>' to 'const boost::shared_ptr<T> &'
1>          with
1>          [
1>              CharT=char
1>          ]
1>          and
1>          [
1>              T=ThreadSafeStream
1>          ]
1>          and
1>          [
1>              T=std::basic_ostream<char,std::char_traits<char>>
1>          ]
1>          Reason: cannot convert from 'const boost::shared_ptr<T>' to 'const boost::shared_ptr<T>'
1>          with
1>          [
1>              T=ThreadSafeStream
1>          ]
1>          and
1>          [
1>              T=std::basic_ostream<char,std::char_traits<char>>
1>          ]
1>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

operator<<()... をうまく定義していないと思いますが、何が問題なのかわかりません。

これは addStream のプロトタイプですvoid add_stream(shared_ptr< stream_type > const& strm); :typedef std::basic_ostream< target_char_type > stream_type;

4

1 に答える 1

2

エラーメッセージから、おそらくa (!) to anpBackend->add_streamが予想されますが、 a to aはまったく関係のない型です。おそらく sで動作するオーバーロードされたメソッドを作成する必要があります。shared_ptrostreamshared_ptrThreadSafeStreamadd_streamThreadSafeStream

于 2012-11-29T17:01:34.563 に答える