我使用出色的Poco框架进行日志记录。目前,我在头文件中定义了Logger和LogStream:
#Foo.h
....
class Foo
{
private:
Poco::Logger &logger = Poco::Logger::get("Foo");
Poco::LogStream logStream{ logger };
};
在我开始使用boost::di之前,这一直很好。当我使用增压注射器像这样为Foo创建对象时,
injector.create<Foo>();
我收到一个编译器错误,说
试图引用已删除的功能
但是,如果删除LogStream定义,则不会出现编译器错误。是否可以在标头中声明LogStream而不定义它?我对C ++还是很陌生,如果有人能指出我在这里做错了什么以及如何正确做对我,我会感到很高兴。非常感谢。
答案 0 :(得分:1)
Foo
的实例由于以下两个原因而无法复制:
1)logger
是引用,创建Foo
时必须初始化引用,因此唯一的方法
为此,要使用构造函数。
编译器无法生成副本分配操作。因此Foo f1,f2; f1 = f2;
无法正常工作。
2)LogStream
的基类是std::ostream
,它已禁用复制操作。
解决方案:
删除logger
作为数据成员,这里是多余的,
因为我们可以在Poco::Logger
初始化的同时调用LogStream
。
class Foo {
//...
Poco::SharedPtr<Poco::LogStream> logStream{
new Poco::LogStream(Poco::Logger::get("Foo"))};
};
要使Foo
可复制,可以使用Poco::SharedPtr
。