在Namespace中声明的DataType的范围

时间:2011-08-11 17:02:07

标签: c++ types namespaces

Sample.h

namespace Testing
{
    enum Type
    {
        DATA = 0,
        MORE_DATA
    };
}

现在在Sample2.h中,使用相同的命名空间,我可以访问Sample.h中定义的DataType,而不包括它吗?

namespace Testing
{
    Type test;
}

问题出现了,因为我有实现这个的文件,似乎没有问题。 另一个用户正在尝试构建,但报告他必须在Sample2.h中#include“Sample.h”才能构建。

3 个答案:

答案 0 :(得分:1)

大多数当前编译器不支持前向枚举声明。这是即将推出的C ++ 0x的计划功能。您可以创建指向可能的指针,但无法实例化,这也与其他类型(结构和类)兼容。

噢,我的坏,我猜错了。无论如何,阅读其他人并阅读此内容。标题不是独立编译的。因此,如果您没有在标题中包含必需的标题并将其包含在cpp文件中,则不会遇到任何错误。只要所有cpp文件都包含具有所需顺序的标题,就不会有任何问题。但是,这不是一个好主意,最好在标题中包含任何必要的文件,并使用标题保护来确保它们不会被添加两次。我希望这是有道理的。

答案 1 :(得分:1)

最有可能构建文件,因为一些早期的包含文件包含Sample.h。当省略早期的include文件(或在Sample2.h之后移动)时,文件将不再编译。

答案 2 :(得分:0)

是的,您需要在Sample2.h中包含Sample.h。 Sample {0}中的编译器看不到Type的定义,因为命名空间名称在2个文件中是相同的。

通过在2个文件中使用相同的命名空间名称,您唯一获得的是Type不需要在Sample2.h中明确声明其命名空间。例如,如果2个名称空间不相同:

Sample.h

namespace Testing
{
    enum Type
    {
        DATA = 0,
        MORE_DATA
    };
}

Sample2.h

#include "Sample.h"

namespace Testing1
{
    Testing::Type test;
}