3

メンバーは次のように定義されます。

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を使用しています

4

2 に答える 2

6

に渡すタイプから参照を削除する必要がありますmake_shared。以下が機能するはずです。

node_knot.exit_to = std::make_shared<std::remove_reference<decltype(*node_knot.exit_to)>::type>();
于 2013-03-20T19:06:48.520 に答える
4

問題は、 の型が*exit_to参照であり、 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、クラスに a を追加し、必要な場所で一貫して使用することです。

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

于 2013-03-20T19:11:31.157 に答える