在方法定义内明确指定名称空间

时间:2018-08-30 11:12:30

标签: c++ namespaces

我们假设我有一个命名空间strings.xml,并且在其中声明了一个类<string name="encouraging_comment"> Les %1$s sont compliqué%2$ss... </string> ,该类的构造函数继承了带有其构造函数的类<string name="encouraging_comment"> %1$s are complicated... </string> 和其他类{{1 }}和公开可用的方法Foo

Bar

现在,我要在实现中定义Base构造函数,如下所示:

Baz

似乎可以这样写下来了:

boo()

意味着一旦我在namespace Foo { class Baz { public: void boo(); }; class Base { public: Base(); }; class Bar: public Base { public: Bar(); }; } 中明确指定了名称空间,就无需在此方法的定义中稍后指定它。

从显式提及名称空间到定义的末尾,它在任何地方都一样工作吗?

1 个答案:

答案 0 :(得分:3)

如果我们查看您的Bar构造函数定义:

Foo::Bar::Bar(): Base() {
    Baz::boo();
}

一旦编译器读取了构造函数(Foo:::Bar::Bar)的声明部分,它就会知道作用域,并且不再需要它。

一个更有趣的例子是

namespace Foo
{
    struct Baz {};

    struct Bar
    {
        Baz fun(Baz);
    };
}

Foo::Baz Foo::Bar::fun(Baz)
{
    // Irrelevant...
}

现在,对于结构本身的定义,Baz不需要任何名称空间限定符,因为它是在名称空间中定义的,并且名称空间的所有符号都可以直接使用。

函数fun的定义是不同的。因为它不是在名称空间中定义的,所以我们需要对返回类型完全限定Baz结构。与实际函数名称相同。但是然后就像以前编译器读取并解析该部分一样,它知道范围并且知道参数Baz实际上是Foo::Baz

您可以了解有关名称查找The GIF的更多信息。