#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的朋友。我该怎么做?
答案 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类的嵌套结构中。