C++ 如何将唯一的ptr参数推回到共享ptr的向量上

C++ 如何将唯一的ptr参数推回到共享ptr的向量上,c++,vector,shared-ptr,unique-ptr,C++,Vector,Shared Ptr,Unique Ptr,我很难将唯一的_ptr从方法参数推回到共享指针向量上 IFCCB.h: private: vector<shared_ptr<IFC>> m_shpVectorIFC; public: void addElementVectorIFC(unique_ptr<IFC> rupIFC); IFCCB.cpp: void IFCCB::addElementVectorIFC(unique_ptr<IFC> rupIFC) { m_shpVec

我很难将唯一的_ptr从方法参数推回到共享指针向量上

IFCCB.h:

private:
vector<shared_ptr<IFC>>  m_shpVectorIFC;
public:
void addElementVectorIFC(unique_ptr<IFC> rupIFC);
IFCCB.cpp:

void IFCCB::addElementVectorIFC(unique_ptr<IFC> rupIFC)
{
    m_shpVectorIFC.push_back(std::unique_ptr<IFC>(new IFContent(rupIFC)));
}
我得到了一个错误:

C2664:'IFC::IFCconst IFC&':无法从转换参数1 'std::unique_ptr>'到'IFO*'

在这种情况下,IFO是IFC的继承人父公司。我不知道为什么它会这么看

我已经看过了,还有


有什么想法吗?我不习惯使用shared_ptr和unique_ptr。

根据您的附录,您需要使用unique_ptr::get为IFContent构造函数提供所需的原始指针。根据它对指针的作用,您可能实际上需要使用release来防止双重删除。此外,在将其直接转换为共享的\u ptr时,无需创建中间唯一的\u ptr:


根据您的附录,您需要使用unique_ptr::get为IFContent构造函数提供所需的原始指针。根据它对指针的作用,您可能实际上需要使用release来防止双重删除。此外,在将其直接转换为共享的\u ptr时,无需创建中间唯一的\u ptr:

问题是push_back接受容器的值_类型,它是shared_ptr,但您要传递给它一个unique_ptr,从unique_ptr到shared_ptr的转换使用显式构造函数,并且只能从unique_ptr rvalue执行,因此参数不能隐式转换为shared_ptr

要使其正常工作,您需要使用std::move将唯一的\u ptr转换为右值,然后显式地将其转换为共享的\u ptr:

unique_ptr<IFC> p;
// ...
m_shpVectorIFC.push_back(std::shared_ptr<IFC>(std::move(p)));
我不相信您创建新的唯一\u ptr的代码是正确的,为什么您不能使用上面显示的任一解决方案将rupIFC插入到容器中?但是如果这真的是您想要做的,那么您得到的错误是因为您试图将unique_ptr传递给IFContent构造函数,该构造函数采用IFO*而不是unique_ptr。要进行编译,您需要从rupIFC中获取原始指针:

注意:正如dlf的回答所说,如果您只想立即将其转换为共享的ptr,那么创建唯一的ptr是没有意义的,因此您可以简单地执行以下操作:

m_shpVectorIFC.emplace_back(std::make_shared<IFContent>(rupIFC.release()));
问题是push_back接受容器的值_类型,它是shared_ptr,但您要传递给它一个unique_ptr,从unique_ptr到shared_ptr的转换使用显式构造函数,并且只能从unique_ptr rvalue执行,因此参数不能隐式转换为shared_ptr

要使其正常工作,您需要使用std::move将唯一的\u ptr转换为右值,然后显式地将其转换为共享的\u ptr:

unique_ptr<IFC> p;
// ...
m_shpVectorIFC.push_back(std::shared_ptr<IFC>(std::move(p)));
我不相信您创建新的唯一\u ptr的代码是正确的,为什么您不能使用上面显示的任一解决方案将rupIFC插入到容器中?但是如果这真的是您想要做的,那么您得到的错误是因为您试图将unique_ptr传递给IFContent构造函数,该构造函数采用IFO*而不是unique_ptr。要进行编译,您需要从rupIFC中获取原始指针:

注意:正如dlf的回答所说,如果您只想立即将其转换为共享的ptr,那么创建唯一的ptr是没有意义的,因此您可以简单地执行以下操作:

m_shpVectorIFC.emplace_back(std::make_shared<IFContent>(rupIFC.release()));

很难说,但在我看来,您的错误是IFContent构造函数不接受唯一的\u ptr。IFC构造函数有一个IFO*参数。但是IFC的默认构造函数不应该接受IFC吗?顺便说一句,这是一个输入错误…IFCt现在被更改为上面的IFC。您真的想从rupIFC参数创建一个新对象,还是仅仅因为您无法让它工作?你只是想把rupIFC推到容器中吗?这是我想到的第一种方法。我认为我无法将我的唯一指针推回到共享ptr向量上。它们需要不同…独特的和共享的vec。但是如果你认为这不起作用,为什么你要尝试用一个新的独特的?!很难说,但在我看来,您的错误是IFContent构造函数不接受唯一的\u ptr。IFC构造函数有一个IFO*参数。但是IFC的默认构造函数不应该接受IFC吗?顺便说一句,这是一个输入错误…IFCt现在被更改为上面的IFC。您真的想从rupIFC参数创建一个新对象,还是仅仅因为您无法让它工作?你只是想把rupIFC推到容器中吗?这是我想到的第一种方法。我认为我无法将我的唯一指针推回到共享ptr向量上。它们需要不同…独特的和共享的vec。但是如果你认为这不起作用,为什么你要尝试用一个新的独特的?!我没有rupIFC的getter。我应该能够在这里使用默认构造函数,使用m_shpVectorIFC.push_backsd::shared_ptrnew IFConten
trupIFC,不是吗?rupIFC是一个独特的_ptr,它定义了get以提供一个指向底层对象的原始指针。我想您指出了IFContent的构造函数需要一个原始指针。如果IFContent保留该指针并试图稍后删除它,请确保所有权已明确定义,当原始的unique_ptr执行相同的操作时,您将遇到麻烦。unique_ptr可转换为shared_ptr,因此您可以这样做。能够将所有权从一个智能指针转移到另一个智能指针有什么奇怪的?转换是完全安全的,其效果是释放唯一的\u ptr拥有的对象,并将所有权转移到共享的\u ptr。我没有rupIFC.get的getter。我应该可以在这里使用默认构造函数,使用m_shpVectorIFC.push_backsd::shared_ptrnew IFContentrupIFC,不是吗?rupIFC是唯一的,它定义了get以提供指向底层对象的原始指针我想您指出了IFContent的构造函数需要一个原始指针。如果IFContent保留该指针并稍后尝试删除它,请确保所有权已明确定义,当原始的unique_ptr执行相同的操作时,您将遇到麻烦。unique_ptr可转换为shared_ptr,因此您可以这样做。能够将所有权从一个智能指针转移到另一个智能指针有什么奇怪的?转换是完全安全的,具有释放唯一\u ptr拥有的对象并将所有权转移到共享\u ptr的效果。创建新副本应该是可以的,因为当我执行get/pop时,我也在创建副本。创建新副本应该是可以的,因为当我执行get/pop时,我也在创建副本。
std::unique_ptr<IFC>(new IFContent(rupIFC.release()))
m_shpVectorIFC.emplace_back(std::make_shared<IFContent>(rupIFC.release()));