使类或结构成为所有模板实例化类的朋友?

时间:2017-03-01 17:43:27

标签: c++ c++11 templates

#include <iostream>

using namespace std;

struct s1;

template <typename... type>
class Base : public type::inner...
{
    friend struct s1;

};

struct Test;

struct s1
{
    template <typename... type>
    friend class Base;

    friend class Test;

    private:
    struct inner {

    int member1;
    int member2;
    };
};

struct s2
{
    struct inner {

    int member3;
    int member4;
    };
};

struct Test : public s1::inner, public s2::inner
{

};

int main()
{
    Base<s1, s2> base;
    base.member1 = 0;

    Test t;
    t.member3 = 22;

    cout << "Hello world!" << endl;
    return 0;
}

当我尝试编译上面的代码时,我收到以下错误

在&#39;类Base&#39;的实例化中: 错误:&#39; struct s1 :: inner&#39;是私人的

但是,当尝试通过注释掉基本变量来编译该程序时,类Test成功编译而没有错误。我想让名为Base的模板类成为struct s1的朋友。我该怎么做?

1 个答案:

答案 0 :(得分:1)

这是针对这个奇怪问题的解决方法......

使用嵌套结构创建一个继承内部结构的结构:

template <class... Types>
struct BaseInherit {
  struct Inner : public Types::Inner... {};
};

然后,继承BaseInherit在Base中的嵌套内部:

template <class... Types>
class Base : public BaseInherit <Types...>::Inner {};

这就是我必须为GCC做的事情(6.3.1)。

编辑:忘了说你会将BaseInherit添加为朋友结构,而不是Base。示例:

class S1 {

  template <class... Types>
  friend struct BaseInherit;

  struct Inner { int member1, member2; };

};

编辑:如何找到解决方法 - 我试图弄清楚编译器在继承时推断可变参数模板的顺序。由于它直接继承时抱怨,我认为它可能在课堂范围内起作用。当然,我们不能从它自己的嵌套结构继承,所以我们把它放在另一个struct / public类的嵌套结构中。