C++ 为什么编译器需要对已通过类限定的成员函数定义的返回类型使用类限定符?

C++ 为什么编译器需要对已通过类限定的成员函数定义的返回类型使用类限定符?,c++,function-declaration,C++,Function Declaration,我对描述这个问题的措辞有点不确定,但举个例子: Foo.h namespace sample { class Foo { public: enum Bar { kValue1, kValue2, } Bar SomeMethod(Bar some_value); } } // namespace sample Foo.cc namespace sample { Bar Foo::SomeMetho

我对描述这个问题的措辞有点不确定,但举个例子:

Foo.h

namespace sample {

  class Foo {
    public:
      enum Bar {
        kValue1,
        kValue2,
      }

      Bar SomeMethod(Bar some_value);
  } 
}  // namespace sample
Foo.cc

namespace sample {

  Bar Foo::SomeMethod(Bar some_value) { // compiler complains here
    if (some_value == Bar::kValue1) {
      return Bar::kValue2; // but not here
    } else {
      return Bar::kValue1;
    }
  }
}  // namespace sample
编译器抱怨定义中的返回类型,说:

错误:未知类型名称“Bar”

为什么给出
somethod
限定
Foo::somethod
的定义并没有将相同的限定扩展到
Bar
的返回类型,而是将限定扩展到该方法定义中的
Bar
的所有其他用途

  Bar Foo::SomeMethod               (Bar some_value)
//^^^ Here is "outside" the class    ^^^ Here is "inside" the class
由于
Bar
是在类中定义的,因此需要使用
Foo::
前缀来访问它,除非您在类本身内部


由于
Bar
是在类中定义的,因此需要使用
Foo::
前缀来访问它,除非您在类本身内部。

这是一个名称查找问题。通常,只有在参数列表或函数体中,才能自动查看
Foo
的内部:

namespace sample {

  class Foo {

    public:

      enum Bar {
        kValue1,
        kValue2,
      };

      Bar SomeMethod(Bar some_value);
  }; 

  Foo::Bar Foo::SomeMethod(Bar some_value) {
    if (some_value == Bar::kValue1) {
      return Bar::kValue2;
    } else {
      return Bar::kValue1;
    }
  }
} //namespace sample

int main() {}

这是一个名称查找问题。通常,只有在参数列表或函数体中,才能自动查看
Foo
的内部:

namespace sample {

  class Foo {

    public:

      enum Bar {
        kValue1,
        kValue2,
      };

      Bar SomeMethod(Bar some_value);
  }; 

  Foo::Bar Foo::SomeMethod(Bar some_value) {
    if (some_value == Bar::kValue1) {
      return Bar::kValue2;
    } else {
      return Bar::kValue1;
    }
  }
} //namespace sample

int main() {}

简短回答-因为这就是语言语法。除了“语言就是这样设计的”之外,这些问题很难回答。@CaptainGiraffe而不是“为什么语言是这样的”,我把它理解为“这两个地方有什么不同,使得一个语法起作用,而不是另一个”但你有一个正确的观点。如果我正确地回忆起98在本例中参数所需的范围解析
Foo::SomeMethod(Foo::Bar some_value)
(根据James的回答),则更高版本不会。可能两者都有一点。:-)我知道“为什么是语言”系的问题有点重,但我也在互联网上找不到答案,所以我觉得还是值得的。简短的回答——因为这就是语言语法。除了“语言就是这样设计的”之外,这些为什么问题很难回答。@CaptainGiraffe而不是“为什么语言是这样的”我认为它的意思是“这两个位置有什么不同,使一个语法起作用,而另一个语法不起作用”,但你有一个正确的观点。如果我没记错的话,这个例子中的参数需要98个范围解析
Foo::SomeMethod(Foo::Bar some_value)
(根据James的回答))我知道“为什么是语言”系的问题有点重,但我也在网上找不到答案,所以我觉得还是值得的。