VC ++编译器没有看到我的任何命名空间和类

时间:2013-01-23 15:02:05

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

我正在用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"之前将它包含在我的主文件中。这也是主要的唯一包括。 ProGUI.h。

// EDIT 2 - &gt;解决

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

2 个答案:

答案 0 :(得分:2)

您似乎正在使用以下声明:

using namespace pGUI;

在课堂宣言之前:

class ProControl
{

};

而不是使用以下方法:

namespace pGUI
{
    class ProControl
    {

    };
}

using namespace,因为它说使用命名空间。您需要使用namespace关键字后跟大括号明确地添加名称空间!

答案 1 :(得分:1)

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

要在命名空间中声明或实现某些内容,您需要更具体。有两个:

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

或:

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

就个人而言,我认为using namespace使用{{1}}是一个懒惰的程序员黑客,完全打败了名称空间。但我离题了。 :)