часткова спеціалізація шаблонів у MSVC ++ 2010 за замовчуванням

Наступний фрагмент не буде компілюватися в MSVC ++ 2010 (компілює з gcc, icc і sun CC):

#include 

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;
}

If I remove a default for class A from Point declaration it compiles just fine. Any suggestions on how to work around this issue without changing non-specialized declaration of Pair (i.e., template< class P1, class P2 > struct Pair;) are greatly appreciated. Removing defaults in the real code is not an option either.

error C2079: 'p' uses undefined struct 'Pair'
          with
          [
              P1=Point,
              P2=Point
          ]
2
Ви передаєте третій (за замовчуванням) аргумент struct Point ? Я маю на увазі клас A завжди є параметром за замовчуванням Attribute ?
додано Автор iammilind, джерело
Ви пробували використовувати 3U, а не 3?
додано Автор Alan Stokes, джерело
Які помилки ви отримуєте?
додано Автор Michael Price, джерело
Я додам помилку до ОП
додано Автор Noil Noil, джерело
Так, я роблю, більшу частину часу це за замовчуванням, але в деяких випадках це зовсім інший тип. До речі, цей фрагмент призначений лише для демонстрації. Реальний код набагато складніший і набагато більш заплутаний.
додано Автор Noil Noil, джерело
Я тільки що пробував, та ж помилка. Незалежно від причини компілятора VC ++ не відповідає спеціалізованому шаблону і хоче створювати екземпляр неспеціалізованого.
додано Автор Noil Noil, джерело

1 Відповіді

Параметр третього шаблону точки повинен з'явитися в спеціалізації:

template
struct Pair>, Point>>
{ ... };
2
додано
Потім задайте інше питання з тими значеннями за замовчуванням.
додано Автор Adam Mitz, джерело
Звичайно, невідомо, що таке Т1 і Т2, тому параметри шаблону спеціалізації. Я не бачу, як це стосується поточного запитання.
додано Автор Adam Mitz, джерело
Дякуємо, це крок у правильному напрямку, але не буде працювати (на VC ++), якщо T1/T2 самі по собі будуть класифіковані за замовчуванням.
додано Автор Noil Noil, джерело
Невідомо, що T1 і T2 є заздалегідь.
додано Автор Noil Noil, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147