ええ、タイトルは赤ちゃんを怖がらせることができますが、実際には非常に簡単です。
図のように、特殊なテンプレート関数、つまりboost :: make_shared(boost 1.41)への関数ポインターを格納しようとしています。
boost::shared_ptr<int> (*pt2Function)() = boost::make_shared<int>;
ただし、boost :: make_sharedには、コンパイラがこのコンテキストで区別できない次の2つの特殊化があるため、コンパイルされません(GCC 4.4.1)。
template< class T > boost::shared_ptr< T > make_shared()
...
template< class T, class... Args > boost::shared_ptr< T > make_shared( Args && ... args )
参考までに、エラー:
In function ‘int main()’:
error: converting overloaded function ‘make_shared’ to type ‘class boost::shared_ptr<int> (*)()’ is ambiguous
boost/smart_ptr/make_shared.hpp:100: error: candidates are: boost::shared_ptr<X> boost::make_shared() [with T = int]
boost/smart_ptr/make_shared.hpp:138: error: boost::shared_ptr<X> boost::make_shared(Args&& ...) [with T = int, Args = ]
非可変個引数のバリエーションをコメントアウトすると、コードは正常にコンパイルされます。
このような2つの引数のない関数間のあいまいさを解決するための適切な構文を知っている人はいますか?