以下代码片段无法在 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
声明它编译得很好。非常感谢任何有关如何在不更改 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>
]
最佳答案
点的第三个模板参数应该出现在特化中:
template<class T1, class T2, unsigned D>
struct Pair<Point<T1, D, Attribute<T1, D>>, Point<T2, D, Attribute<T2, D>>>
{ ... };
关于c++ - MSVC++2010 中带有默认值的部分模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924638/