2011-01-06 50 views
0

当比方说,我有专业化使用多个typenames

template <typename T> 
class F; 

我可以创建另一个模板谁需要一个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<void, F<int> > h_of_f,因为编译器选择原始模板H,而不是专业化。

我用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> > 
{ 
};