частичная специализация шаблонов в MSVC ++ 2010 со значениями по умолчанию - PullRequest
2 голосов
/ 28 октября 2011

Следующий фрагмент не будет компилироваться в 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;
}

Если я уберу значение по умолчанию для class A из объявления Pointон компилируется просто отлично.Будем весьма благодарны за любые предложения о том, как обойти эту проблему без изменения неспециализированной декларации пары (например, 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>
          ]

1 Ответ

2 голосов
/ 28 октября 2011

Третий параметр шаблона точки должен появиться в специализации:

template<class T1, class T2, unsigned D>
struct Pair<Point<T1, D, Attribute<T1, D>>, Point<T2, D, Attribute<T2, D>>>
{ ... };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...