在标题中放置Unique_Ptr会创建对已删除函数错误的引用吗?

时间:2018-01-04 02:59:34

标签: c++ netbeans visual-studio-2017

我一直在尝试使用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中运行良好?

0 个答案:

没有答案