【问题标题】:VC++ compiler doesnt see any of my namespacec or classesVC++ 编译器看不到我的任何命名空间或类
【发布时间】:2013-01-23 15:02:04
【问题描述】:

我正在使用 c++ 开发一个项目,但我一直不知道出了什么问题。我写了 4 节课,工作期间一切看起来都很好(在 Visual Studio 2010 下)。 VS“看到”了所有的定义,我可以使用自动填充和建议,但是当我尝试编译项目时,它突然失明了。就像我没有包含标题或其他东西(我做了)。奇怪的是在 VS 上使用这些类没有问题(我可以 ctrl+space 来提示、属性和方法列表以及所有这些东西)但是当我尝试编译它时说“ClassName”不是一种类型。 以下问题的快速示例:

ProButton.cpp:

#include "ProButton.h"

using namespace pGUI;

ProButton::ProButton( ... )
    : ProControl( ... )
{
    ...
}

ProButton.h:

#ifndef __PRO_BUTTON__
#define __PRO_BUTTON__

#include <string>
#include "ProControl.h"

namespace pGUI
{

class ProButton :
    public pGUI::ProControl
{
public:
    //attributes
    ...

public:
    //methods
    ...

};

}


#endif

但是编译器说: 错误 291 错误 C2653:“ProButton”:不是类或命名空间名称 对于 ProButton.cpp 中的这一行: ProButton::ProButton( ... )

它还说: 错误 23 错误 C2039:“ProControl”:不是“pGUI”的成员
错误 24 错误 C2504:“ProControl”:未定义基类

以及整个项目的所有类似错误。我不知道出了什么问题。看起来我的 VS 坏了:D

当然,那些 (...) 意味着那里有代码,只是现在不那么重要。我可以将所有解决方案上传到某个地方,它会有所帮助。

编辑//

关于命名空间,所有头文件(类声明)都在命名空间中定义:

namespace pGUI{
   class ProClass
   {
   };
}

这些类的所有定义(在 ProClass.cpp 中)都在使用:

using namespace pGUI;

在开头。

我认为问题在于包含文件的顺序。 我不确定这应该怎么做。到目前为止,我有 4 个课程:

ProGUI 类:

  • 有一个指向 ProContainer 的指针
  • 包括:ProContainer 和 ProControl

ProContainer 类:

  • 具有指向:ProGUI 和 ProControl 的指针

ProControl 类:

  • 有一个指向 ProContainer 的指针
  • 包括 ProButton
  • 是 ProButton 的基类

类 ProButton:

  • 是 ProControl 的子类

这些类也使用 irrlicht 库,我不知道在哪里包含它。 我在#include "ProGUI.h" 之前将它包含在我的主文件中。这也是 main 中唯一包含的内容。 ProGUI.h .

//EDIT 2 -> 已解决

这是包含问题。我需要重新考虑我的包含顺序并添加一些前向声明。无论如何,这一切似乎都很奇怪,我花了很多时间才弄清楚。谢谢帮助。 :)

【问题讨论】:

  • ProControlpGUI 命名空间中吗?此代码不能确认这是真的。有没有机会你也可以加入ProControl.h
  • 这里VS坏了值得怀疑。这是您遇到的第一个错误吗?尝试给我们一个最小但完整(没有“...”)的示例来演示问题。
  • 答案在您的编辑中:ProControl 包括 ProButton。为什么会这样做? ProButton 应包括 ProControl。 (就像您在上面的代码中所做的那样。)
  • 如果你只需要在一个类中声明一个指针或引用,你可以在头文件的顶部使用前向声明来声明指针/引用。仅当需要访问包含的头文件中声明的整个类型时,例如从另一个类派生或在类中包含非指针成员时,才需要在另一个头文件中包含一个头文件。

标签: c++ visual-studio-2010 visual-c++ compilation namespaces


【解决方案1】:

看来您使用的是以下语句:

using namespace pGUI;

就在类声明之前:

class ProControl
{

};

而不是使用以下方法:

namespace pGUI
{
    class ProControl
    {

    };
}

using namespace,正如它所说的使用一个命名空间。您需要使用 namespace 关键字后跟大括号明确地将某些内容放入命名空间!

【讨论】:

  • 我在所有头文件中使用:命名空间 pGUI{ } 并使用命名空间 pGUI;在 .cpp 文件中。我不确定这是否正确。我认为最大的问题是包含文件(其顺序)。我编辑了问题以添加更多信息。
  • 第一个编译器错误说明了一切 (C2653)。不要不要使用using namespace,尝试使用namespace pGUI {
  • using namespace pGUI; 更改为 namespace pGUI{ 没有帮助。
  • 不能这样。你缺少一些东西。试着找到它!
【解决方案2】:

using namespace pGUI 通知编译器它应该在 pGUI 命名空间中查找现有名称。

要在命名空间中声明或实现某些内容,您需要更加具体。与任一:

namespace pGUI
{
    ProButton::ProButton( ... ) : ProControl( ... )
    {
        ...
    }
}

或:

pGUI::ProButton::ProButton( ... ) : ProControl( ... )
{
    ....
}

就个人而言,我认为using namespace 的任何使用都是一种懒惰的程序员黑客,它完全违背了命名空间的意义。但我离题了。 :)

【讨论】:

  • 你的aswer和之前删的一样,不是真的,我一直用using声明来实现方法,效果很好。跨度>
  • 好的,很公平。我不知道。 (现在刚刚尝试过。)我仍然不能说我提倡使用using。这是一种本不应该包含在语言中的 hack。
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多