2

ええ、タイトルは赤ちゃんを怖がらせることができますが、実際には非常に簡単です。

図のように、特殊なテンプレート関数、つまり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つの引数のない関数間のあいまいさを解決するための適切な構文を知っている人はいますか?

4

1 に答える 1

2

可変個引数テンプレート引数は、 0..nテンプレート引数を取ることを意味します。したがって、両方のバージョンが一致します。
2番目のバージョンに別のテンプレートパラメーターを追加して、1..n引数を取るようにすることで、あいまいさを解決できます。
このようなものが機能するはずです:

template< class T, class Arg1, class... Args > 
boost::shared_ptr< T > make_shared(Arg1&& arg1, Args && ... args )

しかし、UncleBensが正しく指摘しているように、2つのバージョンも必要ありません。あなたの場合、以下で十分です。

template< class T, class... Args > 
boost::shared_ptr<T> make_shared(Args && ... args );

テンプレート引数を1つだけ使用する場合(つまりT)、0引数バージョンの。を取得しますmake_shared()

于 2010-01-21T13:02:10.163 に答える