【发布时间】:2011-06-10 04:23:45
【问题描述】:
以下代码:
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: 错误:非命名空间范围内的显式特化
'struct A1<T1>'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 是否允许第一个代码?
【问题讨论】:
-
模板特化必须在命名空间范围内,因此编译器希望您在 struct A1 定义之后执行
template<typename T> struct A1<T>::A2<-1> { };之类的操作,但这也不起作用。我很想看到这个问题的答案。在旁注中,Visual C++ 确实允许您的代码,但它不是有效的标准 C++。