Таинственная ошибка компиляции: невозможно преобразовать из 'const boost::shared_ptr‹T›' в 'const boost::shared_ptr‹T›'

Я хотел защитить доступ к файлу журнала, который я использую для многопоточного ведения журнала с библиотекой 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;


person Stephane Rolland    schedule 29.11.2012    source источник
comment
Какая строка на самом деле дает ошибку? Это призыв к add_stream? Если да, можете ли вы предоставить сигнатуру метода для этого?   -  person Dave S    schedule 29.11.2012
comment
pBackend->add_stream(spFileStream); вызывает проблемы. Я ищу прототип и добавлю его в вопрос.   -  person Stephane Rolland    schedule 29.11.2012


Ответы (1)


Из сообщения об ошибке, предположительно, pBackend->add_stream ожидается от shared_ptr (!) до ostream, в то время как вы даете ему от shared_ptr до ThreadSafeStream, который является совершенно не связанным типом. Вам нужно будет создать перегруженный метод add_stream, который, скорее всего, будет работать с ThreadSafeStream.

person Mark B    schedule 29.11.2012
comment
Я не могу изменить код boostlog в соответствии со своими потребностями... Однако мне, очевидно, нужно наследовать std::basic_ostream в моем классе ThreadSafeStream - person Stephane Rolland; 29.11.2012