我正在编写一些 C++ 代码。在这些代码中,有嵌套的命名空间,如 A::B::C。 A、B、C 是命名空间。我在A中定义了一个类型TYPEA,在B中又重新定义了一个TYPEA,按照我的理解,A::B::TYPEA会屏蔽掉A::TYPEA。但为什么我仍然在函数的返回类型中添加命名空间前缀 A::B::TYPEA?
namespace A
{
typedef int TYPEA;
namespace B
{
class ClassB
{
public:
typedef int TYPEA;
TYPEA foo();
};
ClassB::TYPEA ClassB::foo()
{
// ...
}
}
}
根据我的理解,A::B::ClassB::TYPEA会屏蔽A::TYPEA,为什么我不能这样定义foo:
TYPEA ClassB::foo()
{
// ...
}
最佳答案
这只是 C++ 名称查找的规则之一。函数的前导返回类型不在该函数的范围内,因此在该上下文中,编译器不会在 ClassB
的范围内搜索名称 TYPEA
。
虽然 trailing 返回类型在函数的范围内,因此 TYPEA
将 在 ClassB 的范围内找到
如果您使用尾随返回:
auto ClassB::foo() -> TYPEA
{
// ...
}
关于c++ - 为什么我需要在函数的返回类型之前添加一个命名空间前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555360/