gpt4 book ai didi

c++ - 命名嵌套类时无法在 Lambda 中解析名称

转载 作者:太空狗 更新时间:2023-10-29 21:48:17 24 4
gpt4 key购买 nike

我正在使用 MSVC10。

我有一个类C嵌套在类 B 中,它又嵌套在类 A 中. B有一个类型为 C 的成员变量, 和 A有一个 vectorB秒。像这样:

class A
{
class B
{
string foo_;
class C
{
string bar_;
} c_;
};
vector<B> b_;
};

A内我有一个使用 for_each 的成员函数使用 lambda,迭代 vector<B> .

在那个 lambda 中,我尝试获取对 B 的引用和 C (分别):

void A::Run()
{
for_each(b_.begin(), b_.end(), [](std::vector<B>::value_type& that)
{
const B& b = that;
cout << b.foo_;
const B::C& c = b.c_; // 'B' : is not a class or namespace name
// const A::B::C& c = b.c_; <-- THIS COMPILES
cout << c.bar_;
});
}

代码:const B::C& c = b.c_;导致编译器错误,“'B':不是类或 namespace 名称”即使编译器接受 const B& b = that; 没有问题

语言允许这种语法吗?

如果我将其更改为:const A::B::C& c = b.c_;编译器接受它。

这里有一个完整的例子供你玩:

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void foo() {}

class A
{
public:
void Run();

struct B
{
std::string foo_;
struct C
{
std::string bar_;
} c_;
};

std::vector<B> b_;
};

void A::Run()
{
for_each(b_.begin(), b_.end(), [](std::vector<B>::value_type& that)
{
const B& b = that;
cout << b.foo_;
const B::C& c = b.c_; // 'B' : is not a class or namespace name
// const A::B::C& c = b.c_; <-- THIS COMPILES
cout << c.bar_;
});
}

int main()
{
A a;
a.Run();
}

最佳答案

这是编译器中的错误。该代码使用 MSVC 2012 RC 编译良好。我相信相关的错误是 this one .

标准的相关部分是 [expr.prim.lambda] 5.1.2 第 7 条:

The lambda-expression’s compound-statement yields the function-body (8.4) of the function call operator, but for purposes of name lookup (3.4), determining the type and value of this (9.3.2) and transforming id-expressions referring to non-static class members into class member access expressions using (*this) (9.3.1), the compound-statement is considered in the context of the lambda-expression.

关于c++ - 命名嵌套类时无法在 Lambda 中解析名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11128020/

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