【问题标题】:Using directive & scope使用指令和范围
【发布时间】:2020-10-16 02:15:33
【问题描述】:

我对以下代码有疑问:

struct A
{
    A(int i) {};
};

namespace Foo
{
using Alias = A;
}

struct B : Foo::Alias
{
    B();
};

B::B() : Alias(5)
{}

int main()
{
    return 0;
}

它无法编译,因为在 B 构造函数中,我没有精确说明 Alias 的范围。

为什么?

谢谢。

【问题讨论】:

  • 嗯,A 不是模板时,您不必使用完全限定名称吗?我认为它会以同样的方式失败。
  • @TedLyngmo 你是对的:它以同样的方式失败。

标签: c++ c++11 templates namespaces name-lookup


【解决方案1】:

来自命名空间页面上的cppreference

内联(可选)命名空间 attr(可选)标识符 { 命名空间主体 }

namespace-body 定义了一个namespace scope,它会影响name lookup。 由出现在其中的声明引入的所有名称 namespace-body(包括嵌套的命名空间定义)成为成员 命名空间标识符的,这个命名空间定义是否是 原始名称空间定义(引入标识符),或 扩展命名空间定义(它“重新打开”了已经定义的 命名空间)

因此,根据标准提到的内容,命名空间内定义为 namespace-body 的任何内容都被视为该命名空间的范围,qualified name lookup 在引用命名空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    相关资源
    最近更新 更多