为什么成员函数实现结果类型不能用defined in class来描述?
Why in member function implementation result type can't be described by using defined in class?
重构一些代码,我发现,如果我在 class 之外有成员函数定义,它的 return 类型不能使用此 "using" 定义的名称 class.
#include <iostream>
class Foo {
public:
using Bar = int;
Bar f();
};
Bar Foo::f() {
return 42;
}
int main() {
std::cout << Foo().f();
return 0;
}
此代码无法编译,出现错误:“Bar”未命名类型。
我仍然可以使用:
Foo::Bar Foo::f() {
return 42;
}
但是长名字看起来更糟。
这背后的原因是什么?为什么我可以简单地使用 Bar 作为参数类型,但必须添加 Foo:: 才能将其用作 return 类型?
您正在尝试将 Bar
用作 return 类型,但此类型未在您的范围内定义。考虑使用 typedef
like
#include <iostream>
typedef int Bar;
class Foo {
public:
Bar f();
};
Bar Foo::f() {
return 42;
}
int main() {
std::cout << Foo().f();
return 0;
}
编辑:
详细说明为什么如果没有 FOO::
你当前的代码就不能工作(根据@swordfish 的用户建议)
在您的示例中,您使用 using
关键字在 class Foo
内声明类型别名。此功能是在 C++ 11 中添加的。当您尝试在 class 外部定义 class 函数时,class 内部的 using
不可见,因此您有在前面添加 FOO::
以使其工作。这类似于 typedef
,但是如果您想在与此
相同的名称空间中声明 class Baz
,则 typedef
的用法并不理想
class Baz {
public:
using Bar = double;
Bar f();
};
Baz::Bar Baz::f() {
return 42.1234;
}
原因是,在定义函数的地方,Bar
不在范围内。它实际上是 Foo::Bar
,它不是匹配 class 定义之外的非限定名称 Bar
的候选者。
所以把定义改成
Foo::Bar Foo::f()
{
return 42;
}
如果你想真正清楚地让那些只能看到包含 class 定义的 header 的凡人受益,还可以更改函数的声明(在 class定义)同理。
重构一些代码,我发现,如果我在 class 之外有成员函数定义,它的 return 类型不能使用此 "using" 定义的名称 class.
#include <iostream>
class Foo {
public:
using Bar = int;
Bar f();
};
Bar Foo::f() {
return 42;
}
int main() {
std::cout << Foo().f();
return 0;
}
此代码无法编译,出现错误:“Bar”未命名类型。 我仍然可以使用:
Foo::Bar Foo::f() {
return 42;
}
但是长名字看起来更糟。
这背后的原因是什么?为什么我可以简单地使用 Bar 作为参数类型,但必须添加 Foo:: 才能将其用作 return 类型?
您正在尝试将 Bar
用作 return 类型,但此类型未在您的范围内定义。考虑使用 typedef
like
#include <iostream>
typedef int Bar;
class Foo {
public:
Bar f();
};
Bar Foo::f() {
return 42;
}
int main() {
std::cout << Foo().f();
return 0;
}
编辑:
详细说明为什么如果没有 FOO::
你当前的代码就不能工作(根据@swordfish 的用户建议)
在您的示例中,您使用 using
关键字在 class Foo
内声明类型别名。此功能是在 C++ 11 中添加的。当您尝试在 class 外部定义 class 函数时,class 内部的 using
不可见,因此您有在前面添加 FOO::
以使其工作。这类似于 typedef
,但是如果您想在与此
Baz
,则 typedef
的用法并不理想
class Baz {
public:
using Bar = double;
Bar f();
};
Baz::Bar Baz::f() {
return 42.1234;
}
原因是,在定义函数的地方,Bar
不在范围内。它实际上是 Foo::Bar
,它不是匹配 class 定义之外的非限定名称 Bar
的候选者。
所以把定义改成
Foo::Bar Foo::f()
{
return 42;
}
如果你想真正清楚地让那些只能看到包含 class 定义的 header 的凡人受益,还可以更改函数的声明(在 class定义)同理。