【问题标题】:Why can't I specialize the nested template member without specializing enclosing class template first?为什么不先专门化封闭类模板就不能专门化嵌套模板成员?
【发布时间】:2012-02-09 21:34:16
【问题描述】:

代码如下:

template <typename T>
struct A
   {
   template <typename U>
   struct B;
   };
template <typename T> template <> // 0_o
struct A<T>::B<int> {};

我知道我不能这样做,但我更想知道逻辑为什么我不能在不先专门化封闭类模板的情况下专门化嵌套模板成员?

感谢任何关于逻辑解释的帮助:)

编辑:

Andrei Alexandrescu 的回复:“没有什么特别的原因 - 这只是一个语言规则。”

【问题讨论】:

  • @Ajai 这个副本怎么样? 0_o,我正在寻找解释
  • 如果您必须在外部专业化和内部专业化之间做出决定,也许会很模糊(例如,假设两者分别是部分专业化的)。
  • +1 表示有趣的问题,很惊讶以前没有人问过这个问题。 :)

标签: c++ templates


【解决方案1】:

这是基于 Xeo 示例的一个想法:首先,让我们有我们的候选主模板:

template <typename T> struct Foo
{
    template <typename U> struct Bar { /* ... */ };
    /* ... */
};

现在假设我们想专门化内部模板,假设:

template <typename T> template <> struct Foo<T>::Bar<bool> { /* ... */ }
// not actual C++!

但现在假设有Foo 的特化:

template <> struct Foo<int>
{
    template <typename U> struct Bar { /* ... */ };
};
template <> struct Foo<char>
{
    template <typename U> U Bar() { }
};

现在如果你想使用Foo&lt;S&gt;::Bar&lt;bool&gt; 怎么办?当S = char 时,我们不能使用内部特化,因为它没有任何意义。但是如果我们不允许外部模板的所有特化的内部特化,那么Foo&lt;int&gt;::Bar&lt;bool&gt; 不是特化的,而Foo&lt;float&gt;::Bar&lt;bool&gt; 是特化的。所以我们假设的内在特化不适用于Foo&lt;int&gt;,尽管人们可能已经预料到它应该这样做。

这不是无法完成的真正技术原因,而只是说明它会如何产生非常意外的行为。 (例如,假设 int 的特化是后来编写的,现有代码依赖于内部特化。)

【讨论】:

  • 查看我对这个问题的评论,似乎只允许明确的专业化,无论出于何种原因。确实,您似乎在对我的回答的评论中建议专业化仅适用于主模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 2021-06-12
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多