假设我有一个模板类,它需要访问它的任何专门化的私有字段:
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>;
| ^~~~~~~~~
我如何实现这个行为?
考虑没有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;
//...
};