2011-01-06 5 views
0

のは私がデフォルトと専門で、タイプとしてFを取り、別のテンプレートを作成することができますテンプレートの特殊複数の型名を使用した場合、選択していない

template <typename T> 
class F; 

があるとしましょう。

template <typename S> 
class G; 

template <> 
template <typename T> 
class G <F<T> > 
{ 
}; 

私はG<F<int> > g_of_fをインスタンス化できます。コンパイラは専門化をGと正しく選択しています。

だから私の問題です。私は、リスト内の複数のテンプレートの型名でこれを行いたいと思います。私は

template <typename U, typename S> 
class H; 

template <typename U> 
template <typename T> 
class H <U, F<T> > 
{ 
}; 

をしようとすると、コンパイラは、元のテンプレートHなく専門を選択しているので、しかし、今私は、H<void, F<int> > h_of_fをインスタンス化することはできません。

私はg ++ 4.1とg ++ 4.4で同じ動作を観察しました。

私は期待してい道を作業から、コンパイラを防ぐことだGHの違いは何ですか?

答えて

3

template<>構文は明示専門宣言を導入するために使用され、何ここには部分特化があります:

template <typename S> 
class G; 

template <typename S> 
class G < F<S> > 
{ 
}; 

template <typename U, typename S> 
class H; 

template <typename U, typename S> 
class H <U, F<S> > 
{ 
}; 
1
template <typename U, typename S> 
class H; 

template <typename U, typename T> 
class H <U, F<T> > {}; 

この構文:

template <> template <typename U> 

は、テンプレートの外にテンプレートメンバーの定義/専門です: http://www.comeaucomputing.com/techtalk/templates/#outsidedef

+0

大変感謝しています。 –

関連する問題