在lambda函数g ++-4.8中调用继承的受保护子类型

时间:2018-07-09 07:47:50

标签: c++ g++4.8

在以下代码中,编译从g ++ 4.1到4.9失败。 “错误”似乎已从g ++-5.1中得到纠正。我在gcc.godbolt.org下使用-std = c ++ 11编译标志进行了尝试。

#include <algorithm>
#include <vector>

class A 
{
protected:
    struct S
    {
        int a;
        int b;
    };
};

class B : public A
{
    std::vector<A::S> v;

public:
    void foo(std::vector<A::S> v)
    {
        std::sort(v.begin(), v.end(),
                [](const A::S& a,       // <--- error only here !
                   const A::S& b) { return a.a < b.b; });
    }

    void auto_sort()
    {
        foo(this->v);
    }
};

int main()
{
    B b;
    b.auto_sort();

    return 1;
}

返回的错误是:'struct A :: S'受保护 它仅出现在lambda函数声明中。

我的问题是:这是g ++-4.X中的错误吗?因此可以纠正吗?还是自g ++-5.1起已更改的c ++规则?还是我错过了什么?

我是否必须将lambda函数编写为作为参数传递的B的方法?

当然,我的目标是在任何g ++版本下进行代码编译。

谢谢

1 个答案:

答案 0 :(得分:1)

这是一个GCC错误(已修复),与在lambda上检查访问说明符有关。该代码是有效的C ++ 11。作为解决方法,您可以将A::S访问权限移到保证可以正确检查protected指定符的位置。可以通过引入类型别名来实现:

using T = A::S;
std::sort(v.begin(), v.end(),
        [](const T& a,       
           const T& b) { return a.a < b.b; });

Live