在以下代码中,编译从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 ++版本下编译代码。
谢谢,
这是一个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; });