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



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

#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;
}

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

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

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

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

谢谢

这是一个 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; });

最新更新