部分模板专门化在msvc++ 2010与默认值

partial template specialization in MSVC++2010 with defaults

本文关键字:msvc++ 2010 默认值 专门化      更新时间:2023-10-16

下面的代码片段不能在msvc++ 2010上编译(在gcc, icc和sun CC下编译良好):

#include <iostream>
template< class T, unsigned D > struct Attribute
{
    T attr[D];
};
template< class T, unsigned D, class A = Attribute< T, D > > struct Point
{
    T coor[D];
    A a;
};
template< class P1, class P2 > struct Pair;
template< class T1, class T2, unsigned D > struct Pair< Point< T1, D>, Point< T2, D > >
{
    Point< T1, D> p1;
    Point< T2, D> p2;
    static const char * id()
    {
        return "specialized";
    }
};
int main()
{
    Pair< Point< float, 3>, Point< double, 3> > p;
    std::cout << p.id() << std::endl;
    return 0;
}

如果我从Point声明中删除class A的默认值,它编译得很好。任何关于如何在不改变Pair(即template< class P1, class P2 > struct Pair;)的非专业声明的情况下解决此问题的建议都非常感谢。在实际代码中删除默认值也不是一个选项。

error C2079: 'p' uses undefined struct 'Pair<P1,P2>'
          with
          [
              P1=Point<float,3>,
              P2=Point<double,3>
          ]

Point的第三个模板形参应该出现在专门化中:

template<class T1, class T2, unsigned D>
struct Pair<Point<T1, D, Attribute<T1, D>>, Point<T2, D, Attribute<T2, D>>>
{ ... };