2011-04-04 40 views
3

这里是整个代码获取错误:编译与C++错误和命名空间

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' 

很显然,我失去了一些重要的东西在这里。我究竟做错了什么?

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

+2

编辑完成后,您的代码将在MSVC 10上编译。它必须是另一段代码中的另一个错误。 – 2011-04-04 02:24:37

+0

确实。我想我没有对我的真实代码做适当的修改。非常感谢你的帮助! – 2011-04-04 02:28:52

+0

错误来自'dxmanager.cpp'还是来自另一个包含'engine.h'和/或'dxmanager.h'的编译单元? – greatwolf 2011-04-04 02:46:04

回答

2

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

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

+0

感谢您指出。仍然有10个错误,尽管.. = /相同类型的错误。 – 2011-04-04 02:17:33

1

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

+0

我在名称空间内移动了前向声明,但我仍然收到错误。 – 2011-04-04 02:20:54

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

+0

我正在考虑这一点。感谢您的信息。 – 2011-04-04 02:32:02