如何从lambda访问私有成员传递给友好类的构造函数?

时间:2018-01-24 21:28:22

标签: c++ c++11 lambda compiler-errors

如何从lambda访问静态成员?

class A
{
public:
    A(std::function<void()> f)
    {
        f();
    }
};

class B
{
private:
    friend class A;
    static bool c;
};

bool B::c = false;

A a([]() { B::c = true; });

此代码给出了错误C2248:

  

'B :: c':无法访问类'B'中声明的私有成员

1 个答案:

答案 0 :(得分:2)

您无法在此处访问lambda中的静态成员。

您将班级A标记为朋友,但您创建的lambda与AB直接无关 - 它有自己的类型,当然,它不是B的朋友。这就是您尝试访问B::c时出错的原因。

您可以考虑从B::c构造函数中将f传递给A作为替代方法:

class A;

class B
{
private:
    friend class A;
    static bool c;
};

bool B::c = false;

class A
{
public:
    A(std::function<void(bool&)> f)
    {
        f(B::c);
    }
};

A a([](bool& value) { value = true; });