使用C ++和命名空间编译错误

时间:2011-04-04 02:11:07

标签: c++ class namespaces forward-declaration

以下是获取错误的整个代码:

Engine.h

#ifndef ENGINE_H
#define ENGINE_H

#include "DXManager.h"

namespace XEngine
{
    class Engine
    {
    };
}

#endif

DXManager.h

#ifndef DX_MANAGER_H
#define DX_MANAGER_H



namespace XEngine
{
    class Engine; // forward declaration

    class DXManager
    {
    public:
        void run(Engine *engine);
    };
}

#endif

DXManager.cpp

#include <iostream>

#include "Engine.h"
#include "DXManager.h"

using namespace XEngine;

void DXManager::run(Engine *engine)
{
    std::cout<<"DXManager::run"<<std::endl;
}

使用这30行代码,我得到20个错误,如:

'XEngine' : a namespace with this name does not exist
'XEngine' : a symbol with this name already exists and therefore this name cannot be used as a namespace name
syntax error : identifier 'Engine'
显然,我在这里遗漏了一些重要的东西。我做错了什么?

注意:我知道循环依赖是一件坏事,但在我的特殊情况下,我认为它是相关的。

3 个答案:

答案 0 :(得分:3)

在DXManager.cpp中,您不仅仅使用名称空间XEngine中的某些名称。您可以在该命名空间中定义函数。

所以必须:

<强> DXManager.cpp

#include <iostream>

#include "Engine.h"
#include "DXManager.h"

namespace XEngine {

void DXManager::run(Engine *engine)
{
    std::cout<<"DXManager::run"<<std::endl;
}

}

AFAIK也有一些编译器(如MSVC)处理using变体。   但它不正确,因为您的语法试图定义函数::DXManager::run - 而不是您想要定义的::XEngine::DXManager::run

答案 1 :(得分:2)

在类Engine的前向声明中,此时名称空间XEngine不存在。

解决方法是在名称空间块中移动声明。

答案 2 :(得分:1)

当Engine.h包含DXManager.h时,后者定义了一个类XEngine :: Engine,而没有先声明命名空间。