私はboost::shared_ptr
しかかからない関数(私は制御しない)にスタック変数へのポインタを渡そうとしています。テンプレート引数なしでmake_sharedをブースト
this answerによれば、boost::make_shared
を使用しています。この機能をテストするために私はこれを書いた:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
int main(int argc, char const *argv[])
{
int i = 10;
boost::shared_ptr<int> int_ptr = boost::make_shared(i); // doesn't work
some_function(int_ptr); // this function takes only shared_ptr
return 0;
}
をしかし、それは次のようなエラーがスローされます。
error: no matching function for call to ‘make_shared(int&)’
boost::shared_ptr<int> int_ptr = boost::make_shared(i);
^
私は次のようにテンプレート引数を追加した場合ので、それは動作しますが、その理由は何ですか?
boost::shared_ptr<int> int_ptr = boost::make_shared<int>(i);
ありがとうございます!
namespace boost {
template<typename T, typename Arg1>
shared_ptr<T> make_shared(Arg1 const & arg1);
}
テンプレートメカニズムは、パラメータarg1
の種類を推測することができます
「int」を与えるだけであれば、どのようなタイプの共有ポインタを使うべきか自問してください。 'shared_ptr'が必要で、 'shared_ptr 'は' int'で構築することはできません。 –
NathanOliver
テンプレート引数の減算には、結果が割り当てられるタイプに関する情報を含めることはできません。 'boost :: shared_ptr int_ptr ='部分は、適切なテンプレート引数を決定するために考慮に入れられません。 –
スタック割り当てメモリを指す 'shared_ptr'を作成すると、そのメモリを削除しようとすると悲惨です。 'i'はポインタを通して変更可能である必要がありますか、' 'i''のコピーで十分でしょうか? – chris