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
的成员。