shared_ptr初始化

dig*_*ber 3 c++ shared-ptr decltype

成员定义为

std::shared_ptr<std::array<std::string, 6> > exit_to;
Run Code Online (Sandbox Code Playgroud)

这表示其他人共享的其他数据.当尝试启动指针"exit_to"时.正确的方法是

node_knot.exit_to = std::make_shared<std::array<std::string, 6> >();
Run Code Online (Sandbox Code Playgroud)

但它在另一个文件中,我想保持指针类型一致,如下所示:

node_knot.exit_to = std::make_shared<decltype(*node_knot.exit_to)>();
Run Code Online (Sandbox Code Playgroud)

但是不会编译:

 /usr/include/c++/4.6/bits/shared_ptr_base.h:798:54: error: '__p'
 declared as a pointer to a reference of type
 'std::array<std::basic_string<char>, 6> &'
         __shared_ptr(const __shared_ptr<_Tp1, _Lp>& __r, _Tp* __p)
                                                             ^ /usr/include/c++/4.6/bits/shared_ptr.h:93:31: note: in instantiation
 of template class
 'std::__shared_ptr<std::array<std::basic_string<char>, 6> &, 1>'
 requested here
     class shared_ptr : public __shared_ptr<_Tp>
                               ^ ../node_booker.h:757:20: note: in
 instantiation of template class
 'std::shared_ptr<std::array<std::basic_string<char>, 6> &>' requested
 here
                                                         n.exit_to = std::make_shared<decltype(*n.exit_to)>();
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 12.10下,clang ++ 3.2,--std = c ++ 11

Ed *_*rbu 6

您需要从传递的类型中删除引用make_shared.以下应该有效:

node_knot.exit_to = std::make_shared<std::remove_reference<decltype(*node_knot.exit_to)>::type>();
Run Code Online (Sandbox Code Playgroud)