C++ C++;方法定义不知道类类型

C++ C++;方法定义不知道类类型,c++,C++,为什么编译器抱怨返回的设置未定义,而它却乐于接受它作为参数 福岛水电站 foo.cpp 您需要告诉编译器,Settings在Foo的范围内,因为它是在那里定义的 这就很好地编译了: //foo.cpp Foo::Settings Foo::GetSettings(){ } auto Foo::GetSettings() -> Settings { } 在类内部,您不需要指定它,因为编译器会考虑类范围内的所有名称 在这个定义中, //foo.cpp void Foo::SetSett

为什么编译器抱怨返回的
设置
未定义,而它却乐于接受它作为参数

福岛水电站 foo.cpp
您需要告诉编译器,
Settings
Foo
的范围内,因为它是在那里定义的

这就很好地编译了:

//foo.cpp

Foo::Settings Foo::GetSettings(){
}
auto Foo::GetSettings() -> Settings {
}
在类内部,您不需要指定它,因为编译器会考虑类范围内的所有名称

在这个定义中,

//foo.cpp

void Foo::SetSettings(Settings settings){
}
编译器知道您正在定义一个函数
Foo
,因此类似地,对于函数参数
设置
,您不必指定编译器应该查看的范围

编译器似乎应该知道
GetSettings
也是
Foo
的一个函数。这基本上是正确的,事实上,这编译得很好:

//foo.cpp

Foo::Settings Foo::GetSettings(){
}
auto Foo::GetSettings() -> Settings {
}

在这种情况下,编译器在必须找出返回类型时,就知道在哪个范围内查找返回类型。

您需要告诉编译器
设置
Foo
的范围内,因为它是在该范围内定义的

这就很好地编译了:

//foo.cpp

Foo::Settings Foo::GetSettings(){
}
auto Foo::GetSettings() -> Settings {
}
在类内部,您不需要指定它,因为编译器会考虑类范围内的所有名称

在这个定义中,

//foo.cpp

void Foo::SetSettings(Settings settings){
}
编译器知道您正在定义一个函数
Foo
,因此类似地,对于函数参数
设置
,您不必指定编译器应该查看的范围

编译器似乎应该知道
GetSettings
也是
Foo
的一个函数。这基本上是正确的,事实上,这编译得很好:

//foo.cpp

Foo::Settings Foo::GetSettings(){
}
auto Foo::GetSettings() -> Settings {
}

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

这是因为。这是因为。
编译器知道您正在定义一个Foo函数。
-这两种方法怎么可能不都是这样呢?@terratwoa添加了更多解释。谢谢。。似乎仍然“错”。编译器实际上是在猜测setter函数中的
Settings
Foo::
。它可能是另一个结构。。但我猜它就是这样。@terratwoa编译器可能会发现你正在定义一个方法,但标准说它不允许,编译器按顺序读取标记,在读取
设置
标记时,它不知道下一个标记会告诉它它是
Foo
@terratermatwoa中方法的返回类型——当它看到初始
设置
时,编译器不知道它正在编译类的成员函数
Foo
。直到看到启动成员函数名的
Foo::
,它才知道这一点。不允许回去;它所能做的就是抱怨。因此,对于
Foo::Settings
Foo::GetSettings
,都需要说
Foo::
;第一个表示返回类型是
Foo
的一个成员,第二个表示函数是
Foo
的一个成员。编译器知道您正在定义一个Foo
的函数-这两种方法怎么不能都这样说呢?@terratatwoa补充了更多的解释。谢谢。。似乎仍然“错”。编译器实际上是在猜测setter函数中的
Settings
Foo::
。它可能是另一个结构。。但我猜它就是这样。@terratwoa编译器可能会发现你正在定义一个方法,但标准说它不允许,编译器按顺序读取标记,在读取
设置
标记时,它不知道下一个标记会告诉它它是
Foo
@terratermatwoa中方法的返回类型——当它看到初始
设置
时,编译器不知道它正在编译类的成员函数
Foo
。直到看到启动成员函数名的
Foo::
,它才知道这一点。不允许回去;它所能做的就是抱怨。因此,对于
Foo::Settings
Foo::GetSettings
,都需要说
Foo::
;第一个表示返回类型是
Foo
的成员,第二个表示函数是
Foo
的成员。