为什么编译器会抱怨返回的Settings是未定义的,而将其作为参数接受却很高兴?

foo.hpp

class Foo {
  public:
     typedef struct{
         int id;
     } Settings;

     Settings GetSettings();
     void SetSettings(Settings settings);
};

foo.cpp
// nope
Settings Foo::GetSettings(){
}

// no problem
void Foo::SetSettings(Settings settings){

}

最佳答案

您需要告诉编译器SettingsFoo的范围内,因为它是在其中定义的。

这样编译就可以了:

//foo.cpp

Foo::Settings Foo::GetSettings(){
}

在类内部,无需指定该名称,因为编译器会考虑该类范围内的所有名称。

在这个定义中,
//foo.cpp

void Foo::SetSettings(Settings settings){
}

编译器知道您正在定义Foo函数,因此类似地,您不必为函数参数Settings指定编译器应查看的范围。

似乎编译器应该知道GetSettings也是Foo的功能。这基本上是正确的,实际上,这可以正常编译:
auto Foo::GetSettings() -> Settings {
}

在这种情况下,编译器在必须确定返回类型的时候便知道在哪个范围内查找返回类型。

关于c++ - C++方法定义不了解类类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61257540/

10-15 04:31