为什么成员函数实现结果类型不能用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定义)同理。