2015-01-08 134 views
-3

成员的unique_ptr我没有很多与unique_ptrs经验,但和我有一个艰难的时间确定为什么我收到此错误信息:返回从方法

error C2664: 'IFCC::IFCC(const IFCC &)' : cannot convert argument 1 from 'std::unique_ptr>' to 'IFO *' \Microsoft Visual Studio 12.0\VC\include\memory

这是代码,我认为是导致此编译错误:

IFP.cpp:

std::unique_ptr<IFCC> IFPage::getIFCC() 
{ 
    return(make_unique<IFCC>(m_IFCC)); //recent add that is probably causing issue 
} 

IFP.h:

public: 
    std::unique_ptr<IFCC> getIFCC(); 
private: 
    unique_ptr<IFCC> m_IFCC = nullptr; 

由于某些原因,错误提到了IFO,它是IFP的等级父母。另外,IFCC有IFCCB的母公司,IFCC和IFCCB都有IFO的参数。如果我只是创建一个新的IFCC unique_ptr,我不认为它需要IFCC创建新对象所需的参数,因为我正在使用现有的对象来创建它。

这可能是一些语法错误,我错过了某个地方。似乎没有返回值会导致问题。

我一直在看unique_ptr info,它看起来像我有他们有什么,但我的应用程序更复杂。那么你对错误有什么意见吗?

我也见过stack overflow unique_ptr link,认为它是一个不同的问题,因为他们问如何为编译器实现它,为什么,而我的问题是关于如何实现unique_ptr的返回值。在他们的问题中,显示了一个return语句,但我试图使用make_unique,而他们创建了一个新的unique_ptr并将该变量用作返回值。

回答

2

您不明白make_unique函数需要使用可变参数,也就是说,它会通过转发传递给它的参数来创建模板类型。 C++ 11的亮点之一就是您不需要为1,2,3,4等参数创建大量的模板,只要您想使用这个概念即可。

在你的情况,你试图调用构造函数:

IFCC::IFCC(unique_ptr<IFCC>) 

,我想不存在。相反,编译器试图使用复制构造函数,该构造函数接受一个对IFCC的const引用,并且它不能将unique_ptr转换为该类型。

如果这是您要使用的构造,即拷贝构造,你需要的对象:

make_unique(*m_IFCC); 

您需要潜在地检查是否有一个对象。你的构造函数默认成员为nullptr,如果它仍然存在,你可能还想返回一个nullptr unique_ptr。

我的猜测是,你根本不想返回unique_ptr。这就是所谓的unique。你只有其中一个。所以如果你试图通过“引用”来传递成员变量,你的类就不得不“抛弃”它。

您可能想要实际返回的内容仅仅是对基础对象的引用或指针。或者,如果您似乎正在复制它,只需按给予呼叫者的值将其复制即可。

如果你想返回unique_ptr的原因是因为它是基类的东西(通常是返回unique_ptr的一个很好的理由),你当然希望实现该函数不要调用复制构造函数,目的。

重做unique_ptr这样做通常是在您创建全新对象时完成的,而不是复制现有对象,当尝试通过引用访问成员时肯定不会。

使用“不相关的”对象是未定义的行为,唯一可以安全地做的事情是让它的析构函数被调用。

+0

您的构造函数是一个复制构造函数,它期望对IFCC的引用,我可以从生成的错误消息中看到它。它不需要一个unique_ptr 我告诉你解决方案 – CashCow