我使用出色的Poco框架进行日志记录。当前,我在头文件中定义了Logger和LogStream:

#Foo.h

....

class Foo
{
    private:
        Poco::Logger &logger = Poco::Logger::get("Foo");
        Poco::LogStream logStream{ logger };

};

直到我开始使用boost::di为止,这一直很好。当我使用增压注入(inject)器像这样为Foo创建对象时,
injector.create<Foo>();

我收到一个编译器错误消息,



但是,如果删除LogStream定义,则不会出现编译器错误。是否可以在 header 中声明LogStream而不定义它?我对C++还是很陌生,如果有人能指出我在这里做错了什么以及如何正确做对,我会感到很高兴。非常感谢你。

最佳答案

由于以下两个原因,无法复制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

10-04 19:46