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> &'
有人有线索吗?
答案 0 :(得分:11)
如果std::pair<T1,T2>
没有隐含转换为{{}},则无法使用U
和V
类型的参数构建U
{1}}和T1
进入V
。在您的情况下,没有T2
隐式转换为SceneNode*
。
来自C ++标准:
§20.3.2班级模板
std::shared_ptr<SceneNode>
pair
[pairs.pair]
要求:
template<class U, class V> constexpr pair(U&& x, V&& y);
为is_constructible<first_type, U&&>::value
,true
为is_constructible<second_type, V&&>::value
。效果:构造函数使用
true
初始化first
,std::forward<U>(x)
初始化second
。- 醇>
备注:如果
std::forward<V>(y)
无法隐式转换为U
或first_type
,则无法隐式转换为V
此构造函数不得参与重载决策。
话虽如此,您无法初始化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>
为什么它适用于
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_back
和std::shared_ptr<T>
的情况下,放置的类型是map
,其具有构造函数,如果参数和参数的这些元素的类型之间的转换,则将参数进一步转发到其元素中。不是隐含的(如上所述)。