MSVC ++ da 2010 yilda qisman shablonni ixtisoslashtirilgan

Quyidagi snippet MSVC ++ 2010 da to'planmaydi (gcc, icc va sun CC bilan yaxshi tuziladi):

#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
3-chi (asl) argumentni struct Point ga har doim o'tkazasizmi? Demak, class A har doim standart qiymat Attribute ?
qo'shib qo'ydi muallif iammilind, manba
3 dan ziyod 3U dan foydalanganmisiz?
qo'shib qo'ydi muallif Alan Stokes, manba
Qanday xato (lar) ni olasiz?
qo'shib qo'ydi muallif Michael Price, manba
XTga xatolikni qo'shaman
qo'shib qo'ydi muallif Noil Noil, manba
Ha, men buni ko'pincha odatiy deb hisoblayman, lekin ba'zi hollarda bu butunlay boshqacha. Ushbu snippet faqat namoyish uchun. Haqiqiy kod juda murakkab va juda ham ixcham.
qo'shib qo'ydi muallif Noil Noil, manba
Men faqat bir xil xatoga yo'l qo'ydim. VC ++ kompilyatorining sababi nima bo'lishidan qat'i nazar, maxsus shablonga mos kelmaydi va mutaxassis bo'lmaganni yaratishni istaydi.
qo'shib qo'ydi muallif Noil Noil, manba

1 javoblar

Point ning 3-shabloni parametri ixtisoslashuvda paydo bo'lishi kerak:

template
struct Pair>, Point>>
{ ... };
2
qo'shib qo'ydi
Keyin, bu standartlarni boshqa savol bering.
qo'shib qo'ydi muallif Adam Mitz, manba
Albatta, T1 va T2 nima ekanligi noma'lum, shuning uchun mutaxassislikning shablon parametrlari. Men bu savolga qanchalik dolzarb ekanini tushunmayapman.
qo'shib qo'ydi muallif Adam Mitz, manba
Rahmat, bu to'g'ri yo'nalishdagi qadam, lekin T1/T2 o'z-o'zidan namunalar bilan tasniflangan bo'lsa, ishlamaydi (VC ++ da).
qo'shib qo'ydi muallif Noil Noil, manba
T1 va T2 ning oldindan nimani bilmaganligi.
qo'shib qo'ydi muallif Noil Noil, manba