2016-10-05 9 views
3

に、私はこのようになります機能書きたい:私はこのようにそれを呼び出すことができるように推測shared_ptrのT関数宣言

template<class T> 
void Foo(const std::shared_ptr<const T>& ptr); 

を:しかし

std::shared_ptr<int> ptr; 
Foo(ptr); 

、コンパイラはできませんTを推定し、私はそれを明示的に行う必要があります。

Foo<int>(ptr); 

またはvoid Foo(const std::shared_ptr<T>& ptr)でそれをオーバーロードします。

Fooconst Tという単一の宣言を持つことができますので、Tを推測できますか?

+0

共有ポインタがコピーされるように設計されている - それはグラムです彼らは参照でそれらを渡すことは、私たちの間違った考えです。 – UKMonkey

+0

@UKMonkeyは、まさに正しいものではありません。ここを参照してくださいhttp://stackoverflow.com/questions/3310737/shared-ptr-by-reference-or-by-value – Hayt

+0

@Hayt十分に - そこに述べたように、それはオプションの問題です。私はただ頷き、眠りに戻る。 – UKMonkey

答えて

10

あなたの問題はfoostd::shared_ptr<const int>を必要とするptrstd::shared_ptr<int>として宣言されていることです。

std::shared_ptr<const int> ptr; 
Foo(ptr); 

それとも、fooの宣言からのconst修飾子を削除:どちらのあなたは、constの修飾子を指定してptr宣言あなたは本当にあなたが扱っていることfooに知っておく必要がある場合を除き、

template<class T> 
void Foo(const shared_ptr<T>& ptr); 

shared_ptrfooは本当にジェネリックます

template<class T> 
void Foo(const T& ptr);