【问题标题】:Why does the Standard prohibit friend declarations of partial specializations?为什么标准禁止部分特化的友元声明?
【发布时间】:2013-05-10 03:39:49
【问题描述】:

C++ 标准禁止部分特化的友元声明。 (§14.5.3/8):

友元声明不得声明部分特化。 [示例:

template<class T> class A { };
class X {
    template <class T> friend class A<T*>;   //error
};

--结束示例]

其他问题,例如this one, 已收到援引此禁令的答复,但我想知道 理由。我没有看到它,也无法用我最喜欢的搜索引擎找到它。一世 但是可以发现它可以追溯到 C++98 标准,所以大概 基本原理很明确。谁能给我解释一下?

【问题讨论】:

  • 这怎么“没有建设性”?
  • @LuchianGrigore:粗略的猜测:它有点要求可能的意见
  • @PlasmaHH 除非由真正知道原因的人回答(就像大多数问题一样):)

标签: c++ friend template-specialization


【解决方案1】:

我没有引用,但我怀疑这是因为它会导致在声明朋友的类的范围内而不是在相关模板的范围内声明部分特化,而不是创建一个一堆规则强制朋友声明导致专业化在正确的范围内,他们只是禁止它。

【讨论】:

  • 感谢您的回答,但这是推测性的。肯定有明确的答案和知道的人,所以我会坚持下去。
【解决方案2】:

这里有一些不直接的解释: http://www.cprogramming.com/tutorial/template_specialization.html

最终的实现细节带有部分特化: 如果有 完全通用类型的组合,一些部分专业化, 甚至可能是一些完整的专业?一般的经验法则是 编译器将选择最具体的模板 专业化——最具体的模板专业化是 其模板参数将被另一个模板接受 声明,但它不会接受所有可能的论点 其他同名模板也可以接受。

我推断也许不允许在专业化类型的确定中防止任何歧义。

【讨论】:

  • 你能举一个例子,它会(如果允许的话)导致专业化的选择不明确吗?
  • @faith_k,感谢您的回答,但这是推测性的。肯定有明确的答案和知道的人,所以我会坚持下去。
  • 我根本不买这个。尽管解决规则可能很复杂,但它们仍然会根据特定情况做出决定。而通用的“朋友模板”说明符实际上也使所有专业成为朋友。为什么部分特化友元说明符不能简单地应用于与指定模式匹配的所有特化(包括实例化)?
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多