从方法返回成员unique_ptr

时间:2015-01-08 13:59:30

标签: c++ unique-ptr

我还没有很多使用unique_ptrs的经验,而且我很难确定为什么会收到此错误消息:

  

错误C2664:' IFCC :: IFCC(const IFCC&)' :无法转换参数1   来自' std :: unique_ptr>'到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制作新对象所需的参数,因为我使用现有的对象来制作它。 / p>

我可能错过了某些语法错误。它似乎不会导致返回值导致问题。

我一直在看unique_ptr info,看起来我拥有他们拥有的东西,但我的申请更复杂。那么你对错误有任何意见吗?

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

1 个答案:

答案 0 :(得分: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来执行此操作,当然,在尝试通过引用提供对成员的访问权时,通常不会这样做。

使用“disowned”对象是未定义的行为,唯一安全的做法就是让它的析构函数被调用。