1

以下是一个简单的 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;line交朋友。

不幸的是,我不知道为什么这一行需要这样写。直觉上,我会期待类似的东西friend class B<T>,但是,这不会编译。

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

所以,简而言之,我会很感激任何关于这条线的语法是如何派生或推导的。

4

2 回答 2

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>;
};
于 2012-12-04T22:38:04.170 回答
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>

于 2012-12-04T22:36:23.370 回答