【问题标题】:Namespace treated as type命名空间被视为类型
【发布时间】:2015-10-10 14:26:55
【问题描述】:

我有两个文件 Collider.h 和 Collidable.h,以这种方式组织:

Folder 1:
----Collider.h
----Folder 2:
--------Collidable.h

这是文件内容: Collidable.h

#pragma once


#include "../Collider.h"

namespace nsInterfaces
{
    class Collidable
    {

    public:
        nsEngine::Collider * col {nullptr};
    public:
        virtual bool collides (const Collidable & other) const noexcept = 0;
        virtual ~Collidable () { delete col; }

    };
}



typedef std::unique_ptr<nsInterfaces::Collidable>   uptCollidable;
typedef std::shared_ptr<nsInterfaces::Collidable>   sptCollidable;
typedef std::vector<sptCollidable>                  CollidableVector;

还有Collider.h

#pragma once

#include "../Utility/Typedef.hpp"
#include "../Utility/GameException.h"

#include "Movement.h"

namespace nsEngine
{
    class Collider
    {
    /**/
    private:
    public:

        Collider () {}
        virtual ~Collider () noexcept {}

        virtual Collider * clone () noexcept = 0;
    protected:
        float x;
        float y;
        /**/
    };
}

正如你所料,我正在为自己开发一款游戏,但我不断收到同样的错误:

error: 'nsEngine' does not name a type
     nsEngine::Collider * col {nullptr};
     ^

当然还有error: "col" was not declared in this scope

我正在使用 cmake 和 mingw w64(我相信 GCC 4.9.1)。我知道我可能没有提供足够的信息,所以问我!

感谢您的阅读。

【问题讨论】:

  • PS : 如果我把相关的两条线转换成 cmets,我的代码就会被构建。
  • 老实说,问题似乎出在其余代码中。你可以尝试写::nsEngine::Collider 看看是否有帮助。
  • 嗯,这并没有改变任何东西,值得一试。我尝试在我的 main.cpp 中创建一个“aaatest”类,并创建一个公共 nsEngine::Collider * a; 成员变量,它可以工作......也许它必须看到“.. " 在包含...
  • 是的,这是我的第二个想法 - 包含其他文件。要测试这个理论,最简单的方法是将标题重命名为其他内容...
  • @AlanStokes 有一个好主意。在这种情况下,您可以尝试类似class nsEngine::Collider * col {nullptr};

标签: c++ c++11 namespaces cmake


【解决方案1】:

我试图在我的环境(Windows/Visual Studio)下重现您的问题,但我没有这个问题。我遇到的唯一错误是一些Impossible to open the source file ../Collider.h,如果它不在构建路径中(即使collidable.h 是),在这种情况下,同样的'ncEngine' does not name a type 错误。

我确实注意到您使用当前文件的相对路径包含了所有文件。例如:../Utility/GameException.h... 为什么不使用与项目根目录相关的路径并包含这样的文件:

#include "Engine/collider.h"
#include "Engine/Interface/collidable.h"
#include "Utility/GameException.h"

这可能无法解决您的问题,但它可以在我的 Win/Visual 环境中解决,并且(在我看来)使代码更易于理解。

【讨论】:

    【解决方案2】:

    我尝试使用 MINGW 和 g++ 5.1,实际上我可以重现该错误,当我忘记在 pragma once 前面放一个 # 时,我得到了它。如果我将 # 放在前面,它会正确构建,所以我看到它只是偶然。它似乎与包含的相对路径无关,所以它就像 pragma once 不起作用。

    我建议尝试使用#ifndef/#define/#endif 保护而不是使用#pragma once.

    【讨论】:

    • 如果我从其他地方调用它,只要我评论成员,它就会编译。我尝试替换所有的编译指示,没有用。
    【解决方案3】:

    这是一个循环包含的错误问题,绕过#pragma once 和/或#ifndef/#define#endif

    但找不到原因。

    【讨论】:

      猜你喜欢
      • 2022-12-31
      • 2013-03-25
      • 2011-08-16
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 2012-05-28
      相关资源
      最近更新 更多