问题描述
||
如下代码:
template <class T1>
struct A1
{
template <int INDEX>
struct A2 { /* ... */ };
template <>
struct A2<-1> { /* ... */ };
};
int main()
{
A1<int>::A2<-1> x;
}
给出此错误:
prog.cpp:7:13:错误:非命名空间范围ѭ1中的显式专业化
prog.cpp:8:10:错误:模板参数未在部分专业化中使用:
prog.cpp:8:10:错误:\'T1\'
我如何最好地解决此错误?我尝试了这个:
template <class T1>
struct A1
{
template <int INDEX,class DUMMY = void>
struct A2 { /* ... */ };
template <class DUMMY>
struct A2<-1,DUMMY> { /* ... */ };
};
int main()
{
A1<int>::A2<-1> x;
}
似乎可行,但似乎有些忽悠。
有更好的解决方法吗?
我已经看过以前的答案,只能在类中找到具有函数的类,而在类中找不到。我还在其他答案中找到了“ DUMMY”技巧,但想知道是否有更好的解决方案。
另外,作为附带说明,C ++ 0x允许使用第一个代码吗?
解决方法
在不专门化ѭ5的情况下,不允许显式地专门化
A2
(第14.7.3 / 18节)。 C ++ 0x具有相同的限制(n3242§14.7.3/ 16)。同时,允许嵌套类的部分专业化。因此,使用虚拟类的技巧是可以的。