作为一般规则,命名空间范围允许显式专业化。 代码如下:
template<typename T>
class B {
template<typename U> void test {};
template<> void test<int> {};
};
使 g++ 产生以下错误:
error: explicit specialization in non-namespace scope
同时,友元函数模板特化是使友元函数模板在类模板内工作的两种可能方法之一。 下面的代码就像一个魅力:
template<typename T>
class B;
template<typename T>
void test(B<T>);
template<typename T>
class B {
friend void test<>(B<T>);
};
同时,以下内容无法编译,给出与代码片段相同的错误:
template<typename T>
class B {
template<typename U> friend void test(U);
template<>friend void test<B<T>>(B<T>);
};
我的问题是:
friend void test<>(B<T>);
假设您修复了示例中明显的语法错误:
类范围内也允许显式专业化。这很早之前就已经澄清了,但这是一个 GCC 从未实现过的缺陷报告(到目前为止),请参阅 GCC bug 报告。
但是,
friend
声明不能声明显式或部分特化。这样做其实不太明智。
正如您所展示的,已经可以将函数模板的特定专业化添加为好友。对于
friend
声明来说,专业化是否被声明为显式专业化并不重要,因此没有理由允许它。您可以稍后在命名空间范围内声明函数模板的显式特化。