C ++模板部分特化

时间:2010-08-10 03:33:00

标签: c++ templates

我无法弄清楚如何专门化这个模板。编译器抱怨模板参数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;
};

有更简单的方法吗?

1 个答案:

答案 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个模板参数。部分特化必须位于编译器在尝试编译部分特化之前已经“看到”基本模板的位置。部分特化是作为与基本模板完全独立的模板编写的(当然,基本模板和所有特化必须具有相同的名称)。