Я хотел защитить доступ к файлу журнала, который я использую для многопоточного ведения журнала с библиотекой 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
Я подозреваю, что я плохо определяю оператор‹‹()... но я не нахожу, что не так.
это прототип addStream: void add_stream(shared_ptr< stream_type > const& strm);
с typedef std::basic_ostream< target_char_type > stream_type;
add_stream
? Если да, можете ли вы предоставить сигнатуру метода для этого? - person Dave S   schedule 29.11.2012pBackend->add_stream(spFileStream);
вызывает проблемы. Я ищу прототип и добавлю его в вопрос. - person Stephane Rolland   schedule 29.11.2012