log4cplus 2.0 : unique_ptr(const unique_ptr) is deleted

log4cplus

最近在使用log4cplus,gitHub上已经更新到2.0以后,但是网上基本上都是以前版本的教程。 所以遇到了一些问题,这里记录下来。 比如,以前的标准使用流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <log4cplus/configurator.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/initializer.h>
#include <log4cplus/layout.h>
#include <log4cplus/logger.h>
#include <log4cplus/loggingmacros.h>

int main(int argc, char* argv[]) {
/* step 1: Instantiate an appender object */
SharedAppenderPtr _append(new FileAppender("Test.log"));
_append->setName("filelogtest");

/* step 2: Instantiate a layout object */
std::string pattern = "%d{%m/%d/%y %H:%M:%S} - %m [%l]%n";
std::auto_ptr<Layout> _layout(new PatternLayout(pattern));

/* step 3: Attach the layout object to the appender */
_append->setLayout(_layout);

/* step 4: Instantiate a logger object */
Logger _logger = Logger::getInstance("test_logger.subtest");

/* step 5: Attach the appender object to the logger */
_logger.addAppender(_append);

/* log activity */
LOG4CPLUS_DEBUG(_logger, "This is the FIRST log message...");
LOG4CPLUS_WARN(_logger, "This is the SECOND log message...");

return 0;
}

ERROR1:auto_ptr is deprecated

①错误提示:
1
auto_ptr<Layout> is deprecated,use unique_ptr instead
②原因:

意思是auto_ptr已经被弃用,现在使用unique_ptr

③解决方法:

于是将auto_ptr改为unique_ptr:

1
2
-- std::auto_ptr<Layout>  _layout(new  PatternLayout(pattern));
++ std::unique_ptr<Layout> _layout(new PatternLayout(pattern));

ERROR2:unique_ptr(const unique_ptr) is deleted

①错误提示:

这个时候会报第二个错误:

1
2
3
error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) \
[with _Tp = log4cplus::Layout; _Dp = std::default_delete<log4cplus::Layout>]’

②原因:

unique_ptr拥有它所指向的对象,在某一时刻,只能有一个unique_ptr指向特定的对象。当unique_ptr被销毁时,它所指向的对象也会被销毁。因此不允许多个unique_ptr指向同一个对象,所以不允许拷贝与赋值。

③解决方法:

只能移动unique_ptr。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。

1
2
--  _append->setLayout(_layout);
++ _append->setLayout(std::move(_layout));

log4cplus 2.0 : unique_ptr(const unique_ptr) is deleted
https://www.shangyexin.com/2018/06/14/log4cplus/
作者
Yasin
发布于
2018年6月14日
许可协议