试图理解&#34;模板<class u =“”>朋友类B;&#34;语法</类>

时间:2012-12-04 22:29:47

标签: c++ syntax grammar friend

以下是一个简单的c ++程序,它使用我的MinGW编译器进行编译,并按预期执行:

#include <iostream>


template <class T> class A {
    T a;
    template <class U> friend class B;

  public:
    A<T> (T t) : a(t) {}
};



template <class T> class B {
   A<T> aa;

  public:

    B<T> (T t) : aa(t) {}

    T getT() const {return aa.a;}
};


int main() {
    B<int> b(5);
    std::cout << "> " << b.getT() << std::endl;
}

由于B<T>::getT()访问私有 A<T>::a成员,A<T>会使B<T>成为template <class U> friend class B;行的朋友。

不幸的是,我不知道为什么这条线需要像这样写。直观地说,我本来期望像friend class B<T>这样的东西,但是,这不会编译。

新引入的U的含义也不清楚,因为在这两种情况下AB的依赖类型都是T

因此,简而言之,我对如何推导或推导出该行的语法有所了解。

2 个答案:

答案 0 :(得分:5)

友谊和模板有许多不同的排列。

您现有的代码会将B任何模板专精化为A<T>的朋友,因此例如B<char>A<int>的朋友

如果你只想让匹配的A<T>成为朋友,你会这样说:

template <typename> class B;  // forward declare above!

template <typename T>
class A
{
    // ...

    friend class B<T>;
};

答案 1 :(得分:3)

恕我直言,friend class B<T>;如果您插入了前瞻性声明

将会有效
template<class T> class B;

之前的class A<T>

template <class U> friend class B;让每个class B<U>成为朋友,而不只是class B<T>