10
4

1 に答える 1

10

あなたの場合の問題は、 different から/への変換の可能性ではありませんが、std::shared_ptrテンプレート関数の型推論の仕組みに関連しています。

コンパイラが関数呼び出しをテンプレートと一致させようとすると、完全一致のみが受け入れられます。つまり、型変換はまったく受け入れられません。この場合、関数は を受け取りstd::shared_ptr<const T>、呼び出し元はstd::shared_ptr<U>where Uis notを持ちconstます。完全一致ではないため、テンプレートを破棄して次のオーバーロード候補を選択します。

簡単な回避策は次のとおりです: 型推論を完全に回避し、テンプレート引数を提供します。

std::shared_ptr<A> p;
foo<A>(p);             // will use the templated shared_ptr conversion

または、自分で変換を実行します。

foo(std::shared_ptr<const A>(p));
于 2012-10-03T15:56:36.900 に答える