命名嵌套类时无法解析 lambda 中的名称
Unable To Resolve Name In Lambda When Naming Nested Class
我正在使用MSVC10。
我有一个嵌套在类B
中的类C
,而类又嵌套在类A
中。 B
有一个类型为 C
的成员变量,A
的vector
为 B
s。 这样:
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':不是类或命名空间名称",即使编译器接受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 编译良好。我相信相关的错误是这个。
该标准的相关部分是 [expr.prim.lambda] 5.1.2 条款 7:
lambda 表达式的复合语句产生函数体 (8.4) 的函数调用运算符,但用于名称查找 (3.4),确定此(9.3.2)的类型和值并转换 将非静态类成员引用为类成员的 id 表达式 使用 (*this) (9.3.1) 访问表达式,复合语句为 在 lambda 表达式的上下文中考虑。
相关文章:
- Lambda 捕获、初始值设定项和嵌套结构
- 在嵌套 lambda 的情况下如何初始化 lambda 捕获?
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 重构嵌套绑定以使用 lambda 函数
- 通过嵌套的lambda中的值捕获指针导致Segfault
- 为什么这个嵌套的 lambda 不被认为是 constexpr?
- 嵌套的 lambda 函数
- 如何更新嵌套lambda功能(C )中的变量
- 嵌套模板功能中的C 0x lambda参数
- 嵌套C lambda功能的标题
- 嵌套的lambda表达式在用Visual C++编译和生成巨大的对象文件时速度非常慢
- 命名嵌套类时无法解析 lambda 中的名称
- boost::bind in boost::lambda 的嵌套用法不起作用
- 嵌套Lambda捕获问题
- 如何从嵌套的 lambda 表达式函子类创建
- 使用lambda执行嵌套函数
- c++11嵌套lambda编译segfault
- (C++) 使用 lambda 作为嵌套函数,甚至用作通用函数
- 当在嵌套的lambda中使用“decltype”时,GCC的分离错误