为什么.h中定义的私有结构在.cpp文件中需要返回类型的作用域?

Sko*_*ius 0 c++ namespaces private-members

标头看起来像这样:

namespace A {
class A {
  private:
    struct B  {
      int x;
    };

    B foo();
};
}
Run Code Online (Sandbox Code Playgroud)

我的.cpp看起来像这样

namespace A {
   A::B A::foo() { //implement }
}
Run Code Online (Sandbox Code Playgroud)

我为什么不能这样做:

B A::foo() {//implement}
Run Code Online (Sandbox Code Playgroud)

如果B作用域位于A.h文件中,为什么A::B还要在cpp文件中使用?我们已经在A命名空间中就不必定义A::B?是否足够?我知道这B是私有的A,但是对于命名空间真的重要吗?

Nat*_*ica 8

在到达A::foo函数定义之前,您将处于开始定义函数的范围之内。由于您不在类范围内,B因此不在范围内,并且会导致编译器错误。

您必须使用A::告诉编译器B的位置。到达目的地后,A::foo您将A再次处于范围之内,并且不需要它。您可以做的一件事是使用尾随返回类型将返回内容放入类范围

auto A::foo() -> B { ... }
Run Code Online (Sandbox Code Playgroud)