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

问题描述 投票:1回答:1

在以下代码中,编译从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 ++版本下编译代码。

谢谢,

c++ g++4.8
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.