2

下面的代碼片段將不會在MSVC++編譯2010(編譯罰款與海灣合作委員會,國際會議中心和太陽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 APoint聲明它編譯得很好。有關如何解決此問題而不更改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> 
      ] 
+0

什麼錯誤(S),你接受? –

+0

我會將錯誤添加到OP –

+0

您是否將第三個(默認)參數傳遞給'struct Point'?我的意思是'A類'總是一個默認參數'Attribute '? – iammilind

回答

2

點的第3個模板參數應出現在專業化:

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

謝謝,這是一個正確的方向邁出的一步,但如果T1/T2本身被模板化爲默認值,它將無法工作(在VC++上)。 –

+0

然後用這些默認值提出另一個問題。 –

+0

事先不知道T1和T2是什麼。 –