C++:嵌套模板类错误"非命名空间范围中的显式特化"

Cli*_*ton 25 c++ templates c++11

以下代码:

template <class T1>
struct A1
{
  template <int INDEX>
  struct A2 { /* ... */ };

  template <>
  struct A2<-1> { /* ... */ };
};

int main() 
{
  A1<int>::A2<-1> x;
}
Run Code Online (Sandbox Code Playgroud)

给出了这个错误:

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;
}
Run Code Online (Sandbox Code Playgroud)

这似乎工作,但似乎有点软糖.

有没有更好的解决方法?

我查看过以前的答案,只能在类中找到函数,而不是类中的类.我还在其他答案中找到了"DUMMY"技巧,但想知道是否有更好的解决方案.

另外,作为旁注,是C++ 0x允许的第一个代码吗?

Kir*_*sky 11

如果A2没有专门化A1(第14.7.3/18节),则不允许明确专门化.C++ 0x具有相同的限制(n3242§14.7.3/ 16).同时,允许嵌套类的部分特化.所以使用虚拟类的技巧就是Ok.

  • 标准不允许这样的代码背后的原因是什么?由于否则存在编译器错误,为什么标准不会指示编译器有效地插入"DUMMY"模板本身? (2认同)