【问题标题】:C++: Nested template classes error "explicit specialization in non-namespace scope"C++:嵌套模板类错误“非命名空间范围内的显式特化”
【发布时间】: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&lt;T1&gt;' 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&lt;typename T&gt; struct A1&lt;T&gt;::A2&lt;-1&gt; { }; 之类的操作,但这也不起作用。我很想看到这个问题的答案。在旁注中,Visual C++ 确实允许您的代码,但它不是有效的标准 C++。

标签: c++ templates c++11


【解决方案1】:

不允许在不专门化 A1 的情况下明确专门化 A2(第 14.7.3/18 节)。 C++0x 具有相同的限制(n3242 §14.7.3/16)。同时允许嵌套类的部分特化。所以使用虚拟类的技巧是好的。

【讨论】:

  • 标准不允许这样的代码背后的原因是什么?否则会出现编译器错误,为什么标准不指示编译器有效地插入“DUMMY”模板本身?
  • @Clinton,检查this 问题。
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多