我正在使用MSVC10。
我有一个类C
,它嵌套在类B
中,而后者又嵌套在类A
中。 B
的成员变量类型为C
,A
的{{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_;
答案 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表达式的上下文中被认为是。