好友 && 模板

Friend && Template

我实际上是在尝试让一个模板 class 与另一个模板 class 成为朋友。 类似的东西:

#include  <iostream>

template < typename T >
class  Test1 {

  private:
    static int  wantToBeFriend;
};

template < typename T >
int  Test1<T>::wantToBeFriend = 1;


template < typename T >
class  Test2 {

  friend class Test1<T>;

  public:
    void  run() {

      std::cout << Test1<T>::wantToBeFriend << std::endl;
    }
};

int main()
{
  Test1<int> test1;
  Test2<int> test2;

  test2.run();
  return 0;
}

但是我做不到,gcc 说 int Test1<T>::wantToBeFriend is private。 有人知道如何实现吗?

谢谢

友谊并没有按照您试图让它发挥作用的方式发挥作用。当你有

friend class Test1<T>;

这意味着 Test1<T> 可以访问 Test2<T> 的私有成员。它不允许 Test2<T> 访问 Test1<T> 的私有成员。如果是这样,那么拥有私人成员就没有意义了,因为您可以让自己成为 class 的朋友并访问他们。

如果我们像这样切换它

template < typename T >
class  Test2;

template < typename T >
class  Test1 {
  friend class Test2<T>;

  private:
    static int  wantToBeFriend;
};

然后代码编译正常 Test2<T> 可以访问私有成员(Live Example)。

你需要反过来做。 Test1需要声明Test2为好友class:

#include  <iostream>

template <typename T> class Test2;

template < typename T >
class  Test1 {
  template <typename U> friend class Test2; 
  private:
    static int  wantToBeFriend;
};

template < typename T >
int  Test1<T>::wantToBeFriend = 1;


template < typename T >
class  Test2 {

  public:
    void  run() {

      std::cout << Test1<T>::wantToBeFriend << std::endl;
    }
};

int main()
{
//  Test1<int> test1;
  Test2<int> test2;

  test2.run();
  return 0;
}

Live Demo