17

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

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

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

--结束示例]

其他问题,例如这个问题,已经收到了援引这一禁令的答案,但我想知道原因。我没有看到它,也无法用我最喜欢的搜索引擎找到它。然而,我可以发现它可以追溯到 C++98 标准,所以大概原理是非常基本和明确的。有人可以向我解释吗?

4

2 回答 2

2

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

于 2013-05-15T14:29:44.673 回答
0

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

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

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

于 2013-05-15T14:14:37.997 回答