c++ - 为什么我需要在函数的返回类型之前添加一个命名空间前缀?

标签 c++

我正在编写一些 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
{
    // ...
}

Demo

关于c++ - 为什么我需要在函数的返回类型之前添加一个命名空间前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56555360/

相关文章:

c++ - 编译器可以通过 sleep 调用重新组织指令吗?

c++ - 如何在一段时间内更新 QLabel?

c++ - 指向指针的 const 问题

c++ - 使用 shared_ptr 时出现 SEGFAULT

C++匹配括号解决方案

c++ - Pthreads 和信号 C++

C++:将对象添加到当前对象

c++ - Windows 上的微秒分辨率时间戳

c++ - CUDA——简单的代码,但我的一些 warp 不运行

c++ - std::any 的存储对象类型的可能性