【问题标题】:Compiling Error with C++ and namespace使用 C++ 和命名空间编译错误
【发布时间】:2011-07-28 21:11:16
【问题描述】:

这是出现错误的整个代码:

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'

很明显,我在这里遗漏了一些重要的东西。我做错了什么?

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

【问题讨论】:

  • 您的代码在编辑后在 MSVC 10 上编译。一定是另一段代码中的另一个错误。
  • 确实如此。我想我没有对我的真实代码进行适当的修改。非常感谢您的帮助!
  • 错误是来自dxmanager.cpp 还是来自另一个包含engine.h 和/或dxmanager.h 的编译单元?

标签: c++ class namespaces forward-declaration


【解决方案1】:

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

解决方法是将声明移动到命名空间块内。

【讨论】:

  • 感谢您指出。不过还剩下 10 个错误.. =/ 相同类型的错误。
【解决方案2】:

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

【讨论】:

  • 我在命名空间中移动了前向声明,但我仍然收到错误。
【解决方案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

【讨论】:

  • 我在心里记下了这一点。感谢您提供信息。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 2011-08-26
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多