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

时间:2012-06-20 20:52:12

标签: c++ visual-studio-2010 lambda c++11

我正在使用MSVC10。

我有一个类C,它嵌套在类B中,而后者又嵌套在类A中。 B的成员变量类型为CA的{​​{1}}个vector。像这样:

B

class A { class B { string foo_; class C { string bar_; } c_; }; vector<B> b_; }; 内我有一个成员函数,它使用A和lambda来迭代for_each

在该lambda中,我尝试获取对vector<B>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_; }); } 导致编译器错误,“'B':不是类或命名空间名称”,即使编译器接受const B::C& c = b.c_;没有问题

语言是否允许这种语法?

如果我将其更改为:const B& b = that;,编译器会接受它。

以下是您可以使用的完整示例:

const A::B::C& c = b.c_;

1 个答案:

答案 0 :(得分:2)

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

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

  

lambda-expression的复合语句产生函数体   (8.4)函数调用运算符,但用于名称查找   (3.4),确定此类型和值(9.3.2)并进行转换   id-expressions将非静态类成员引用到类成员中   使用(* this)(9.3.1)访问表达式,复合语句是   在lambda表达式的上下文中被认为是