2017-01-16 3 views
-2

次のコードスニペットを見てください。共有ポインタがベクトルにプッシュバックされたときのエラー

#typedef std::shared_ptr<node> node_ptr; 
std::vector<node_ptr> temp;    
for(int i=0; i<4; i++)    
{ 
    temp.push_back(&m_nodes.at(n[i]-1)) // Got error in this line 
} 

m_nodesは、ノードオブジェクトのベクトルとして定義されます。私はこのコードを評価すると

std::vector<node> m_node; 

、私は次のエラーを得た:ポインタについて

error: no matching function for call to 'std::vector<std::shared_ptr<node> >::push_back(__gnu_cxx::__alloc_traits<std::allocator<node> >::value_type*)' 
        temp.push_back(&m_nodes.at(n[i]-1)); 
                ^

私の知識は限られていると私は間違いを見つけ出すことができませんでした。以下およびGoogle検索を通じて与えられた答えから

EDIT
を助けてください、私はポインタのベクトルは悪い考えであるという結論にいますよ。しかし、私の場合は、ポインタのベクトルを使用する必要があっただけです。私は科学的計算にC++を使用しています。ノードオブジェクトには計算に必要な変数が含まれています。ノードオブジェクトの数が多いため、毎回コピーして移動することは困難です。だから、関数と他のクラスのオブジェクトの初期化に渡すために私はノードまたは参照へのポインタを使用する必要があります。
shared_ptrが私の状況で間違った選択である場合、これを行うための他の簡単で効率的な方法がありますか?私はC++の初心者ですから、私は単純な解決法を好むでしょう。

+0

単項演算子 '&'はvu1p3n0x @オペランド – vu1p3n0x

+0

前に行く、あなたが言及したものを上記の編集ですか? – user294664

+0

C++をどのように学びましたか?なぜあなたは(ab)型エイリアスが順番に並んでいるマクロを使用していますか? – StoryTeller

答えて

2

Y*を受け入れるshared_ptr constructorは、explicitです。未使用ポインタをshared_ptrに変換するためのユーザー定義変換としては参加しません。 temp.push_backはローポインタを受け入れるためにオーバーロードされません。したがって、あなたのエラー。

あなたコンパイル時エラーが離れて行くようでしたが、tempshared_ptr sがm_nodesが所有するオブジェクトにdeleteを呼び出して起動しますときに、あなたのプログラムが未定義の動作を示すであろう。


とマクロの使用が恐ろしいです。あなたは非所有ポインタ(shared_ptrは、複雑な所有権のセマンティクスのためである)を必要とするように見えるので

using node_ptr = std::shared_ptr<node>; 

:タイプの別名を使用してください。生ポインタのベクトルを渡すことはまったく問題ありません。あなたの全体のコードを書き換えることなく、適切に意味を変更すること

using node_ptr = node*; 

:あなたのケースでは、単にタイプの別名はこのことにします。

+0

上記の編集の提案をお願いします。 – user294664

+0

@ user294664 - 私の編集を参照してください。 – StoryTeller

0

あなたはpush_backスマートポインタのベクトルへのポインタをすることはできません、あなたはその場で共有ポインタを構築する代わりにemplace_back()を使用する必要があります。

// this will create a new shared_ptr in-place, and will call the appropriate constructor for it. 
temp.emplace_back(&m_nodes.at(n[i]-1)); 

また、あなたの代わりにマクロのtypedefのを使用する必要があります。

typedef std::shared_ptr<node> node_ptr; 
// or, better yet: 
using node_ptr = std::shared_ptr<node> 
+0

ありがとう、それは働いた。しかし、プログラムのコンパイルが成功した後、出力後に 'double free or corruption(!prev)'というエラーが発生します。このエラーは上記の問題に関連していますか? – user294664

+0

@ user294664の場合、スタック上にあるノードのベクトルを作成することはできず、2回削除されるため、スマートポインタのアドレスを作成するだけです。 – SingerOfTheFall

+0

あなたは私に提案してくれますか? – user294664

関連する問題