私は通常、クラスとテンプレートを宣言し、その後にそれらのメソッドを定義します(もちろん、同じヘッダーファイルで)。私はそのように読むほうが簡単だと思います。さて、クラス外の定義で使用する作業型シグネチャを理解できない場合があります。これが私がしていることの簡単な例で、問題を説明しています:
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
( Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
一致する署名を取得するためにスロット内でいくつかのことをWHAT_GOES_HERE
試みましたが、失敗し続けます。タイプTの2つのオブジェクトを渡す場合と、イテレータのペアを渡す場合を区別するために、enable_ifが必要です。テンプレート化されたコンストラクターがメインテンプレート内で定義されている場合、コードは正常に機能します。これは、コードが現在行っている方法ですが、定義を宣言の外に移動したいと思います。
編集: enable_if <...>はそのタイプにデフォルト値を割り当てるため、定義でenable_if <...>を再利用することはできません。これは、そうでない定義では実行できません。また、宣言。