0

一个.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,因为它们都属于同一个命名空间。

我想了解的是为什么在上述特殊情况下需要使用关键字classor namespace::before X& x

它是否与作为虚函数的X继承有关,然后“覆盖”在中?IZX

4

3 回答 3

1

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

  1. 如果将其范围限定在同一个命名空间中,namespace::x那么如果该类未在命名空间中定义,则会出现编译错误。
  2. 如果您将其定义为一个类,并且该定义所属的命名空间中存在同一个类,则该定义将被解析。
于 2012-10-14T01:28:13.707 回答
1

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

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

// two.h

namespace one
{
    class X;

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

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

于 2012-10-14T02:41:27.540 回答
0

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

于 2012-10-14T22:15:36.503 回答