gpt4 book ai didi

c++ - 在 lambda 函数 g++-4.8 中调用继承的 protected 子类型

转载 作者:行者123 更新时间:2023-11-30 04:59:23 27 4
gpt4 key购买 nike

在以下代码中,从 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' is protected它仅出现在 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; });

Live

关于c++ - 在 lambda 函数 g++-4.8 中调用继承的 protected 子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51240438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com