为什么允许显式特化友元函数?

问题描述 投票:0回答:1

作为一般规则,命名空间范围允许显式专业化。 代码如下:

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>);
};

我的问题是:

  1. 为什么朋友会受到这种特殊待遇(希望能参考一个标准);
  2. 完全专业化的邪恶罪孽到底是什么?片段:
    friend void test<>(B<T>);
c++ templates friend specialization friend-function
1个回答
0
投票

假设您修复了示例中明显的语法错误:

类范围内也允许显式专业化。这很早之前就已经澄清了,但这是一个 GCC 从未实现过的缺陷报告(到目前为止),请参阅 GCC bug 报告

但是,

friend
声明不能声明显式或部分特化。这样做其实不太明智。

正如您所展示的,已经可以将函数模板的特定专业化添加为好友。对于

friend
声明来说,专业化是否被声明为显式专业化并不重要,因此没有理由允许它。您可以稍后在命名空间范围内声明函数模板的显式特化。

© www.soinside.com 2019 - 2024. All rights reserved.