以下是获取错误的整个代码:
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'
显然,我在这里遗漏了一些重要的东西。我做错了什么?
注意:我知道循环依赖是一件坏事,但在我的特殊情况下,我认为它是相关的。
答案 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,而没有先声明命名空间。