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

时间:2012-10-14 01:18:42

标签: c++ class namespaces

one.h:

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

two.h

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

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

我想了解的是,在上述特殊情况下,为什么需要在class之前使用关键字namespace::X& x。< / p>

它与X的{​​{1}}继承有关,作为虚函数然后&#34;覆盖&#34;在IZ

3 个答案:

答案 0 :(得分:1)

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

  1. 如果您将其范围设置在同一名称空间namespace::x中,那么您 如果未在类中定义类,则会出现编译错误 命名空间。
  2. 如果您将其定义为一个类,并且该类中存在相同的类 定义所属的命名空间,然后该定义将是 解决。

答案 1 :(得分:1)

是否为命名空间,您需要声明一个您想在以后引用的类。

您可以在文件two.h中#include "one.h"使one::X的整个定义为已知,或者您可以在不定义的情况下添加声明X

// two.h

namespace one
{
    class X;

    class Y
    {
        void f(X const & x);
        // ...
    };
}

在任何一种情况下,需要重新命名命名空间,因为你已经在其中。

答案 2 :(得分:0)

关闭问题:问题是由循环引用引起的。