【发布时间】:2019-11-25 19:38:08
【问题描述】:
我使用优秀的 Poco 框架进行日志记录。目前,我在头文件中这样定义 Logger 和 LogStream:
#Foo.h
....
class Foo
{
private:
Poco::Logger &logger = Poco::Logger::get("Foo");
Poco::LogStream logStream{ logger };
};
在我开始使用boost::di 之前,这一直很好用。当我像这样使用 boost 注入器为 Foo 创建一个对象时,
injector.create<Foo>();
我得到一个编译器错误提示,
试图引用已删除的函数
但是,如果我删除 LogStream 定义,我不会收到编译器错误。是否可以在标头中声明 LogStream 而无需定义它?我对 C++ 很陌生,如果有人能指出我在这里做错了什么以及如何做对,我会很高兴。非常感谢。
【问题讨论】:
-
可能你的
Foo实例被复制了,但是Poco::LogStream的基类是std::ostream这是不可复制的,所以你的Foo实例不能被复制。为避免此问题,您可以将logStream设为某种智能指针、std::shared_ptr或Poco::SharedPtr。 -
感谢@rafix07 抽出宝贵的时间写出来。我会试试你的建议。
-
您不需要将
Poco::Logger &logger存储为此类的数据成员(无法复制引用,因此无法生成默认的复制赋值运算符)。你可以做Poco::SharedPtr<Poco::LogStream> logStream{new Poco::LogStream(Poco::Logger::get("Foo"))};。调用Logger::get并将返回值传递给 Poco::LogStream ctor。 -
嗨@rafix07,使用“new”时不会自动管理内存,是吗?我们需要在 dtor 中使用“删除”吗?
-
嗨,
SharedPtr控制着LogStream的生命周期,你不要手动操作。
标签: c++ logging boost poco-libraries