SUE さんが書きました:しかし、明示的に型を示したにもかかわらず、「オーバーロードされた関数を特定できない」という旨のエラーが吐かれます。
boostのヘッダを見たわけではないですが,
http://www.boost.org/doc/libs/1_53_0/li ... hared.htmlを見ると,
コード:
shared_ptr<A> make_shared (int);
に適合するmake_sharedはなく,make_shared<A>(1)は,
コード:
shared_ptr<A> make_shared (int &&);
若しくは
コード:
shared_ptr<A> make_shared (int const &);
が使われているように思えます。
なので,
コード:
auto f = static_cast< boost::shared_ptr<A> (*)( int && ) >( &boost::make_shared );
若しくは
コード:
boost::shared_ptr<A> (*f)( int && ) = boost::make_shared;
若しくは
コード:
auto f = static_cast< boost::shared_ptr<A> (*)( int const & ) >( &boost::make_shared );
若しくは
コード:
boost::shared_ptr<A> (*f)( int const & ) = boost::make_shared;
とすればよいかと思います。
# C++11の右辺値参照と可変長引数テンプレートをサポートしているか否かで関数テンプレートの定義が異なります。
beatle さんが書きました:static_castを通常のCスタイルキャストにし、&boost::make_sharedを&boost::make_shared<A, int>にしたら解決するようです。
Cスタイルキャストは規則としてreinterpret_castを含む危険なキャストであるため,本来適合しない型であってもキャストを通してしまいます。
今回は,明示的なテンプレートの解決を行って関数を一つに絞った上で,型が異なるために強引にreinterpret_castで型を合わせてしまっているのだと思います。
# &boost::make_shared<A, int>にしたなら,キャストせずにautoなり正規の型でそのまま受ければよいと思う。