成员定义为
std::shared_ptr<std::array<std::string, 6> > exit_to;
指向其他人共享的其他数据。 当尝试启动指针“exit_to”时。正确的方法是
node_knot.exit_to = std::make_shared<std::array<std::string, 6> >();
但它在另一个文件中,我想保持指针类型一致,如下所示:
node_knot.exit_to = std::make_shared<decltype(*node_knot.exit_to)>();
但不会编译:
/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)>();
我在Ubuntu 12.10下,clang ++ 3.2,--std = c ++ 11
答案 0 :(得分:6)
您需要从传递给make_shared
的类型中删除引用。
以下应该有效:
node_knot.exit_to = std::make_shared<std::remove_reference<decltype(*node_knot.exit_to)>::type>();
答案 1 :(得分:4)
问题是*exit_to
的类型是引用,您不能有shared_ptr
引用。
您可以删除引用,但不是找到operator*
返回的类型,然后从中删除引用,而是可能更容易问shared_ptr
它包含的类型:
node_knot.exit_to = std::make_shared<decltype(node_knot.exit_to)::element_type>();
嵌套element_type
是shared_ptr
存储的类型。
另一种选择是在课程中添加typedef
并在任何需要的地方使用它:
typedef std::array<std::string, 6> string_array;
std::shared_ptr<string_array> exit_to;
// ...
node_knot.exit_to = std::make_shared<Node::string_array>();
这比使用decltype