我无法弄清楚如何专门化这个模板。编译器抱怨模板参数N未在部分特化中使用
#include <boost/multi_array.hpp>
template<typename T, class A>
struct adaptable;
template<typename T, size_t N>
struct adaptable<T,
// line below is the problem
typename boost::multi_array<T,N>::template array_view<2>::type>
{
typedef typename boost::multi_array<T,N>::template array_view<2>::type type;
};
我可以添加虚拟模板参数来沉默编译器。
template<typename T, class A, class A0 = A>
struct adaptable;
template<typename T, size_t N>
struct adaptable<T,
typename boost::multi_array<T,N>::template array_view<2>::type,
boost::multi_array<T,N> >
{
typedef typename boost::multi_array<T,N>::template array_view<2>::type type;
};
有更简单的方法吗?
答案 0 :(得分:3)
我的示例中没有看到任何看起来像部分特化的内容。部分特化是一种特殊化,它为某些基本模板参数指定确切类型,但保留其他参数。例如:
template <class T, class U>
struct my_template {
// the base template where both T and U are generic
};
template <class T>
struct my_template<int> {
// A partial specialization where T is still generic, but U == int
};
为了支持部分特化,基础模板必须至少有两个模板参数(调用数字N)。部分专用模板可以具有1..N-1个模板参数。部分特化必须位于编译器在尝试编译部分特化之前已经“看到”基本模板的位置。部分特化是作为与基本模板完全独立的模板编写的(当然,基本模板和所有特化必须具有相同的名称)。