C++:使所有模板专用化成为友元[duplicate]

rvpgvaaj  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(150)

此问题在此处已有答案

C++: Is it possible to friend all instances of a template class?(1个答案)
Make all derived template classes friend of other class in C++(2个答案)
3天前关闭。
假设我有一个模板类,它需要访问其任何特殊化的私有字段:

template<std::size_t SIZE> class Buffer {
    template<std::size_t N> friend class Buffer<N>;

    ...
};

以下代码无法编译:

<source>:4:42: error: specialization of 'template<long unsigned int SIZE> class Buffer' must appear at namespace scope
    4 |     template<std::size_t N> friend class Buffer<N>;
      |                                          ^~~~~~~~~

我怎样才能实现这种行为?

jv4diomz

jv4diomz1#

考虑不带friend说明符的相同声明:

template<std::size_t N> class Buffer<N>;

这不是(主)类模板Buffer的声明,而是Buffer的部分专用化的声明。
(主)类模板本身的声明如下所示:

template<std::size_t N> class Buffer;

因此,添加friend说明符,就可以将类模板本身添加为朋友,这意味着要将它的所有特化添加为朋友:

template<std::size_t SIZE> class Buffer {
    template<std::size_t N> friend class Buffer;

    //...
};

相关问题