代码之家  ›  专栏  ›  技术社区  ›  egst

在方法定义中显式指定名称空间

  •  0
  • egst  · 技术社区  · 7 年前

    Foo 我宣布了一个班级 Bar 在它里面有一个继承类的构造函数 Base 它的构造函数以及其他类 Baz boo() :

    namespace Foo {
        class Baz {
        public:
            void boo();
        };
        class Base {
        public:
            Base();
        };
        class Bar: public Base {
        public:
            Bar();
        };
    }
    

    现在我要定义 酒吧

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

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

    意思是一旦我在 Foo::Bar::Bar() 显式地,不需要稍后在这个方法的定义中指定它。

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   Some programmer dude    7 年前

    如果我们看看你的 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 是不同的。因为它没有在名称空间中定义,所以我们需要完全限定 巴兹 返回类型的结构。实际函数名也是如此。但是就像以前一样,一旦编译器读取并解析了该部分,它就知道了作用域和参数 巴兹 Foo::Baz .

    您可以阅读有关名称查找的更多信息 in this reference .

    推荐文章