![](/img/trans.png)
[英]convert from boost::shared_ptr<T> to boost::shared_ptr<const T>
[英]A mysterious compilation error: cannot convert from 'const boost::shared_ptr<T>' to '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);
with typedef std::basic_ostream< target_char_type > stream_type;
从错误消息中可以预期pBackend->add_stream
是一个shared_ptr
(!)到一个ostream
而你给它一个shared_ptr
到一个完全不相关的ThreadSafeStream
类型。 您需要创建一个重载的add_stream
方法,该方法最有可能与ThreadSafeStream
一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.