一个神秘的编译错误:无法从"const boost::<T>shared_ptr"转换为"const boost::shared_ptr<T>"

A mysterious compilation error: cannot convert from 'const boost::shared_ptr<T>' to 'const boost::shared_ptr<T>'

本文关键字:const lt boost gt ptr shared 转换 一个 错误 编译      更新时间:2023-10-16

我想保护对日志文件的访问,该文件用于使用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;

从错误消息中推测,当您将其ThreadSafeStream shared_ptr到完全不相关的类型时,pBackend->add_stream预期shared_ptr(!)到ostream。您需要创建一个重载的add_stream方法,该方法最有可能与ThreadSafeStream一起使用。