我使用优秀的 Poco 框架进行日志记录。目前,我在头文件中这样定义 Logger 和 LogStream:
#Foo.h
....
class Foo
{
private:
Poco::Logger &logger = Poco::Logger::get("Foo");
Poco::LogStream logStream{ logger };
};
在我开始使用 boost::di 之前,它一直很好用.当我像这样使用 boost 注入(inject)器为 Foo 创建一个对象时,
injector.create<Foo>();
我收到一个编译器错误提示,
attempting to reference a deleted function
但是,如果我删除 LogStream 定义,则不会出现编译器错误。是否可以在header中声明LogStream而不定义它?我是 C++ 的新手,如果有人能指出我在这里做错了什么以及如何正确做,我会很高兴。非常感谢。
最佳答案
Foo
的实例无法复制,原因有二:
1) logger
是reference,reference必须在Foo
创建时初始化,所以唯一的办法
要做到这一点是使用构造函数。
编译器无法生成复制赋值操作。所以 Foo f1,f2; f1 = f2;
无法工作。
2) LogStream
的基类是 std::ostream
,它禁用了复制操作。
解决方法:
删除作为数据成员的logger
,这里是多余的,
因为我们可以在初始化 LogStream
时调用 Poco::Logger
。
class Foo {
//...
Poco::SharedPtr<Poco::LogStream> logStream{
new Poco::LogStream(Poco::Logger::get("Foo"))};
};
要使 Foo
可复制,您可以使用 Poco::SharedPtr
。
关于c++ - 如何声明和定义Poco Logger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57067898/