3

我正在使用 MSVC10。

我有一个C嵌套在 class 中的类B,而后者又嵌套在 class 中A。 有一个类型为B的成员变量C,并且A有一个s。像这样: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':不是类或命名空间名称” ,即使编译器接受没有问题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();
}
4

1 回答 1

2

这是编译器中的一个错误。该代码可以使用 MSVC 2012 RC 正常编译。我相信相关的错误是这个

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

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

于 2012-06-20T21:30:31.413 回答