Emplace指向shared_ptr的多图的指针不起作用

时间:2014-09-23 09:30:41

标签: c++ c++11 shared-ptr multimap emplace

Vector正常运行

Header
std::vector<std::shared_ptr<SceneNode>> subnodes_m;

Definition
void CompositeSceneNode::AddChild(SceneNode* subnode_p)
{
    subnodes_m.emplace_back(subnode_p);
}

Multimap不

Header
std::multimap<unsigned int, std::shared_ptr<SceneNode>> subnodes_m;

Definition
void CompositeSceneNode::AddChild(SceneNode* subnode_p, unsigned int layerIndex)
{
    subnodes_m.emplace(layerIndex, subnode_p);
}

我收到以下错误:

error C2664: 'std::pair<_Ty1,_Ty2>::pair(const unsigned int &,const _Ty2 &)' :
cannot convert parameter 2 from 'RendererD3DWrapper::SceneNode *'
to 'const std::shared_ptr<_Ty> &'   

有人有线索吗?

1 个答案:

答案 0 :(得分:11)

如果std::pair<T1,T2>没有隐含转换为{{}},则无法使用UV类型的参数构建U {1}}和T1进入V。在您的情况下,没有T2隐式转换为SceneNode*

来自C ++标准:

  

§20.3.2班级模板std::shared_ptr<SceneNode> pair

[pairs.pair]
     
      
  1. 要求: template<class U, class V> constexpr pair(U&& x, V&& y); is_constructible<first_type, U&&>::valuetrueis_constructible<second_type, V&&>::value

  2.   
  3. 效果:构造函数使用true初始化firststd::forward<U>(x)初始化second

  4.   
  5. 备注:如果std::forward<V>(y)无法隐式转换为Ufirst_type,则无法隐式转换为V构造函数不得参与重载决策

  6.   

话虽如此,您无法初始化second_type如下所示(std::pair<T1,T2>版本就地 emplace称为std::pair<key_type, mapped_type> } value_type):

std::multimap

因为std::pair<unsigned int, std::shared_ptr<SceneNode>> p( 1, new SceneNode ); 的构造函数采用原始指针(在下面声明)是std::shared_ptr<T>构造函数,因此遇到错误:

  

§20.9.2.2班级模板explicit shared_ptr

[util.smartptr.shared]

在C ++ 11中,您应该 在调用[...] template<class Y> explicit shared_ptr(Y* p); 之前构建std::shared_ptr<T>

emplace

您可以将参数转发给对元素的构造函数(而不是将它们转发给subnodes_m.emplace(layerIndex, std::shared_ptr<SceneNode>(subnode_p)); 自身的构造函数),并使用piecewise construction

std::pair<T1,T2>

DEMO

  

为什么它适用于subnodes_m.emplace(std::piecewise_construct , std::forward_as_tuple(layerIndex) , std::forward_as_tuple(subnode_p)); 的{​​{1}}呢?

std::vector成员函数将std::shared_ptr的参数转发给std::vector<std::shared_ptr<T>>::emplace_back的构造函数,满足显式上下文要求。在emplace_backstd::shared_ptr<T>的情况下,放置的类型是map,其具有构造函数,如果参数和参数的这些元素的类型之间的转换,则将参数进一步转发到其元素中。不是隐含的(如上所述)。