对命名空间和函数参数的好奇心

Curiosity about namespace and function parameters

本文关键字:好奇心 参数 函数 命名空间      更新时间:2023-10-16

one.h:

namespace one {
    class X : public IZ {
        public:
            void function(); // virtual function (=0) in IZ
    }
}

二.H

namespace one {
    class Y {
        public:
            void functionY(class X& x); // or one::X& x
    }
}

我有几个由多个文件分发的类,它们都共享同一个命名空间。据我了解,如果我对所有类都有相同的命名空间,它们都可以相互访问,而无需输入 NAMESPACE::class_x,因为它们都属于同一个命名空间。

我想了解的是,为什么在上面描述的特殊情况下,需要在X& x之前使用关键字classnamespace::

它是否与X继承IZ有关,该继承作为虚函数然后在X中"覆盖"?

在这种情况下,X 类型在编译时解析。链接器需要了解 X 是什么,它是一个类,或者它的作用域在命名空间中。

  1. 如果将其作用域限定为位于同一命名空间中,则namespace::x如果未在命名空间。
  2. 如果将其定义为类,并且同一类存在于定义所属的命名空间,则该定义将是解决。

命名空间与否,您需要声明一个稍后要引用的类。

您可以在文件中 two.h 中#include "one.h"以使one::X的整个定义已知,也可以只添加一个声明X而不定义它:

// two.h
namespace one
{
    class X;
    class Y
    {
        void f(X const & x);
        // ...
    };
}

无论哪种情况,都不需要重新声明命名空间,因为您已经在其中。

结束问题:问题是由循环引用引起的。