友模板类/模板非类型参数

C++: friend template class / template non-type parameter

本文关键字:类型参数      更新时间:2023-10-16

我想实现通用图形类,我仍然有问题,缩小到以下代码:

template <class T> class B
{
    template <T> friend class A;
};

template <class T> class A
{
private:
    std::vector<B<T> *> myBs;
};

class C { };

这个编译得很好,除非我这样做:

B<C> myB;

…这会导致以下错误:

B.h: In instantiation of ‘class B<C>’:
In file included from A.h:12:0,
             from main.cpp:16:
main.cpp:30:10:   required from here
B.h:15:1: error: ‘class C’ is not a valid type for a template non-type parameter
{
^
B.h:11:11: error: template parameter ‘class T’
template <class T> class A;
          ^
B.h:16:31: error: redeclared here as ‘<declaration error>’
template <T> friend class A;

我的想法是绝对错误的,我错过了什么,或者这样的结构是不可能的,混乱的,奇怪的,或者是一个非常(…)非常可怕的事情?

问题是您的friend声明。我建议您先声明A类,然后使用更简单的friend声明。像

template<class T> class A;
template<class T>
class B
{
    friend A<T>;
    ...
};

问题是您是否想让A<T>成为B<T>的朋友。那就用约阿希姆的溶液吧!

如果你想让任何A成为朋友,那么你需要这样做:

template <class T> class B
{
    template<class> friend class A;
};