MSVC ++ 2010'da kısmi şablon uzmanlığı

Aşağıdaki kod parçacığı MSVC ++ 2010'da derlenmeyecektir (gcc, icc ve sun CC ile iyi derler):

#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. (varsayılan) bağımsız değişkeni struct Point öğesine hiç mi iletiyorsunuz? Demek istediğim class A her zaman varsayılan bir parametre Attribute ?
katma yazar iammilind, kaynak
3U yerine 3U kullanmayı denediniz mi?
katma yazar Alan Stokes, kaynak
Hangi hataları alıyorsunuz?
katma yazar Michael Price, kaynak
OP'ye hata ekleyeceğim
katma yazar Noil Noil, kaynak
Evet, çoğu zaman varsayılan var ama bazı durumlarda tamamen farklı bir tür. Btw bu snippet yalnızca gösterim içindir. Gerçek kod çok daha karmaşık ve çok daha kıvrımlı.
katma yazar Noil Noil, kaynak
Sadece denedim, aynı hata. VC ++ derleyicisi neden özel şablonla eşleşmiyorsa ve özel olmayanı ortaya çıkarmak istiyor.
katma yazar Noil Noil, kaynak

1 cevap

Noktanın 3. şablon parametresi uzmanlıkta görünmelidir:

template
struct Pair>, Point>>
{ ... };
2
katma
O zaman bu varsayılanlarla başka bir soru sorun.
katma yazar Adam Mitz, kaynak
Tabii ki T1 ve T2'nin ne olduğu bilinmiyor, bu yüzden uzmanlığın şablon parametreleri. Mevcut soruyla nasıl alakalı olduğunu göremiyorum.
katma yazar Adam Mitz, kaynak
Teşekkürler, doğru yönde bir adımdır, ancak T1/T2'nin kendileri varsayılan olarak sınıflandırılmışlarsa (VC ++ üzerinde) çalışmayacaktır.
katma yazar Noil Noil, kaynak
T1 ve T2'nin önceden ne olduğunu bilmiyoruz.
katma yazar Noil Noil, kaynak