我一直在尝试使用G3Log作为我的记录器,但我遇到了一个奇怪的问题。当我做推荐的方式:
int main() {
std::unique_ptr<g3::LogWorker> logWorker = { g3::LogWorker::createLogWorker() };
auto sinkHandle = logWorker->addSink(...);
g3::initializeLogging(logWorker.get());
}
它按预期工作。在Netbeans 8.1 C / C ++和Visual Studio 2017中都有。但是,当我执行以下操作时:
class Log {
std::unique_ptr<g3::LogWorker> mp_LogWorker;
...
...
};
Log::Log() :
mp_LogWorker(g3::LogWorker::createLogWorker()) {
...
// Essentially the same as the main above here.
...
};
它适用于Linux中的Netbeans 8.1,但在VS2017中尝试同样的操作时,我收到以下错误:
error C2280: 'PE(const PE &)': attempting to reference a deleted function
note: 'Log(const Log &)': function was implicitly deleted because a data member invokes a deleted or inaccessible function 'std::unique_ptr<g3::LogWorker, ...>
现在,在尝试研究此错误时,谷歌提出了一个事实,即unique_ptr不可复制,否则它不会是唯一的。我理解这一点,但似乎在Netbeans 8.1中可以在Linux上运行,但它在VS2017中不起作用。
为什么会出现这种情况?我还没想在MacOS上尝试这个,但是我觉得由于我的Macbook也运行VS2017,这可能无法解决这个问题。
编辑:
我认为PE可能是罪魁祸首,但它不会复制任何东西,只是实例化:
class PE {
private:
Log m_Log;
public:
PE();
};
PE::PE() :
m_Log() {
};
而且,正如我之前所说,这在Netbeans 8.1 Linux中运行良好?