0
template <typename T>
struct A
   {
   template <typename U>
   struct B;

   template <>
   struct B<int> {static const int tag = 1;};  // Works fine in VS2010
   };

我怎样才能以同样的方式专注于 B,但在 A 之外。我尝试了这个但没有成功:

template <typename T> template <>
struct A<T>::B<int> {static const int tag = 1;};

我得到:

error C3212: 'A<T>::B<int>' : an explicit specialization of a template member must be a member of an explicit specialization

这是没有意义的,因为我可以通过在类中定义它来做到这一点

VS2010的问题?语法错误?

谢谢


PS:这个(无论如何应该是错误的,崩溃VS2010):

template <> template <typename T>
struct A<T>::B<int> {static const int tag = 1;};
4

2 回答 2

2

引用 C++ 规范,§14.17.3.18:

在为类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持未特化,除非声明不应显式特化类成员模板,如果它封闭类模板也没有明确专门化。[...]

(我的重点)

这表明您不能特化嵌套在另一个模板类中的模板类,除非外部模板类也被特化。所以看起来 VS2010 的这种行为是错误的,而 g++ 是正确的。

于 2011-02-02T23:54:53.673 回答
1

它只是不那样工作。:-(

你不能在类声明中专门化一个函数,即使 msvc 接受它的默认设置。

如果不专门化封闭类,您也无法专门化成员函数。大多数编译器都对此表示赞同(语言标准也是如此)。

于 2011-02-02T23:57:04.043 回答