C ++标准禁止朋友声明部分特化。 (§14.5.3/ 8):
朋友声明不得声明部分专业化。 [实施例:
template<class T> class A { };
class X {
template <class T> friend class A<T*>; //error
};
- 结束示例]
其他问题,例如this one, 已收到援引此禁令的答案,但我想知道 理。我没有看到它,也无法用我最喜欢的搜索引擎找到它。一世 然而,可以发现,它可以直接回到C ++ 98标准 理由是非常基本和明确的。有人可以向我解释一下吗?
答案 0 :(得分:1)
我没有引用,但我怀疑这是因为它会导致在友元声明类的范围内声明部分特化而不是相关模板的范围,而不是创建一个一堆规则强制朋友声明导致专业化在正确的范围内,他们只是禁止它。
答案 1 :(得分:0)
以下是一些不直接的解释: http://www.cprogramming.com/tutorial/template_specialization.html
最终的实现细节会出现部分特化: 如果有的话,编译器如何选择使用哪种特化 完全通用类型的组合,一些部分特化, 甚至可能还有一些完整的专业化?一般的经验法则是 编译器将选择最具体的模板 专业化 - 最具体的模板专业化是一个 其模板参数将被其他模板接受 声明,但不接受所有可能的论点 其他具有相同名称的模板都可以接受。
我推断可能不允许在确定专业化类型时阻止任何歧义。