如何将成员模板类声明为封闭类的友元

How do I declare a member template class an friend of the enclosing class?

本文关键字:友元 声明 成员      更新时间:2023-10-16

我有一些类

template<typename Fun, typename Arg>
  class TestBuilder
  {
    template<typename Int>
      class Helper
      {};
  };

如何使Helper成为TestBuilderfriend?我试过了:

template<typename Int>
  friend class Helper;

但这只会使名称空间范围Helper类的朋友成为TestBuilder 的朋友

但是Helper是TestBuilder的嵌套类,不是吗?:)

因此,它可以访问外部类的成员(是的,以及它的私有成员),请查看示例:

#include <iostream>
using namespace std;
template<typename Fun, typename Arg>
class TestBuilder
{
  int n;
  char c;
public:
  template<typename Int>
  class Helper
  {
  public:
    void print(TestBuilder& tb) {
      std::cout << tb.n << " " << tb.c << std::endl;
    }
  };
  TestBuilder(int n, char c) : n(n), c(c) {}
};
int main() {
        TestBuilder<int, int> tb(5, 'p');
        TestBuilder<int, int>::Helper<int> h;
        h.print(tb);
        return 0;
}

将输出:

C02QT2UBFVH6-lm:~ gsamaras$ pico main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
5 p

但是,如果您添加另一个类(不是嵌套类,只是另一个),它将无法访问(当然!)TestBuilder的私有成员,请参阅:

class alienClass
{
public:
  /*
   That won't work, you will get:
   error: 'n' is a private member of 'TestBuilder<int, int>'
   error: 'c' is a private member of 'TestBuilder<int, int>'
  */
  void print(TestBuilder<int, int>& tb) {
    std::cout << tb.n << " " << tb.c << std::endl;
  }
};