2

我在 VS 中有一个 C++ 项目,其中包含或多或少 100 个文件(每个文件都是一个类)。几天前我修改了一个,添加了一些声明,现在我无法编译,它给出了很多错误,最后一个:

错误计数超过 100;停止编译

发布错误似乎没用,但这里有一些(几乎都一样):

error C2275: 'btTransform' : illegal use of this type as an expression  
error C2275: 'btVector3' : illegal use of this type as an expression
error C2275: 'btVector3' : illegal use of this type as an expression    
error C2275: 'btVector3' : illegal use of this type as an expression    
error C2504: 'Platform' : base class undefined
error C2535: 'btAlignedObjectArray<T>

请注意,大多数提到的错误不应该是错误,并且 IntelliSense 在错误列表输出中显示没有错误。而且我完全确定我忘记了一个;或类似的东西。

我应该怎么办?另外我正在处理很多东西,我忘记了我修改了哪个文件。我浏览了它们中的大多数,但找不到任何东西。

以下是完整列表: http: //pastebin.com/1CD9fGgn(它太长了,这里放不下)

按照要求:

播放器.h

#pragma once
#include <Ogre.h>
#include "BtOgreGP.h"
#include "BtOgrePG.h"
#include <OISKeyboard.h>
#include <OISJoyStick.h>
#include "BulletCollision\CollisionDispatch\btGhostObject.h"
#include "balance.h"
#include "WorldGenerator.h"
#include "Keys.h"
#include "PlayerController.h"

using namespace Ogre;

class Player
{
public:
    Player(Root*, SceneManager*, RenderWindow*);
    ~Player(void);
    Camera* mCamera;
    void update(const FrameEvent&);
    bool isTouchingBelow();
//  bool isJumping();
    btPairCachingGhostObject* getGhostObject()
    {
        return mGhostObject;
    }
    void clearObjectTouchingNormal()
    {
        mNormals->clear();
    }
    void addObjectTouchingNormal(btVector3* vector)
    {
        mNormals->push_back(*vector);
    }
    btAlignedObjectArray<btVector3> getObjectTouchingNormal()
    {
        return *mNormals;
    }
private:
    btAlignedObjectArray<btVector3>* mNormals;
    double mTimeLastJump;
    WorldGenerator* mGenerator;
    bool mPressJumpLastUpdate;
//  btAlignedObjectArray<btVector3> getObjectTouchingNormal();
    Vector3 mLastVectorVelocity;
    //SceneNode* mCameraHelper;
    SceneNode* mMainNode;
    SceneNode* mBodyNode;
    SceneNode* mCameraPivot;
    SceneNode* mCameraYaw;
    SceneNode* mCameraPitch;
    SceneNode* mCameraHolder;
    SceneManager* mSceneManager;
    BtOgre::DebugDrawer* mDebugDrawer;
    //btRigidBody* mPlayerBody;
    btQuaternion* mDefaultQuaternion;
    Vector3 mStartPosition;
    PlayerController* mKinematicController;
    btPairCachingGhostObject* mGhostObject;
    //bool mIsJumping;
    Radian mLastRotation;
    btVector3 mBodyDimensions;
    /*bool mCameraCenterMovementFlag;
    Radian mCameraCenterYaw;*/
};

class ClosestNotMe : public btCollisionWorld::ClosestRayResultCallback
{
protected:
    btRigidBody* mMe;
public:
    ClosestNotMe (btRigidBody* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
    {
        mMe = me;
    }

    virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace)
    {
        if (rayResult.m_collisionObject == mMe)
            return 1.0;

        return btCollisionWorld::ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace);
    }
};

全局文件

#pragma once
#include <Ogre.h>
#include <vector>
#include "Player.h"

enum GameDifficulty
{
    GD_EASY,
    GD_NORMAL,
    GD_HARD
};

class GlobalVariables
{
public:
    static std::vector<Player*> players;
};
4

4 回答 4

4

滚动到错误列表的顶部,然后处理那个。如果您在 Visual Studio 中,则可以编译它并按 Ctrl-Shift-F12。

如果您在语法上犯了一些错误(我通常的错误是不匹配的引号或大括号),编译器可能会丢失其上下文,因此从那时起的所有内容都变得难以理解。解决它的 唯一方法是纠正发现的第一个错误;然后——如果仍有错误——下一个。在某个时候,您会发现您所做的事情,其余的错误将神奇地消失。

于 2013-07-17T04:24:40.553 回答
2

欢迎来到 C++ 错误的美妙世界。

当遇到这样的事情时,从报告的第一个错误开始(查看编译器的输出)。然后重新编译。重复直到没有更多错误。

有很多不同的语法错误完全混淆了文件的其余部分。这些包括声明中的错误类型、缺少分号和缺少大括号。

我已经看到 200 多个错误通过一个字符修复消失了。

此外,如果您在一个头文件中忘记了分号或大括号,则可能会导致下一个包含的头文件中出现错误。我在 windows.h 中遇到了非常严重的错误,因为我在它之前包含了我的标题并忘记了一些东西。

于 2013-07-17T04:29:00.637 回答
1

当您转储(带注释的)预处理输出并查看编译器获取的信息时, 解决像您描述的那样棘手的编译器错误问题会变得容易得多。cl.exe接受/E参数以便将预处理的输出转储到标准输出(另请参见此 SO 答案)。如果您使用它,并查看该上下文中的错误,则应该很清楚。

'Player': undeclared identifier出现在您认为正在定义该标识符的文件中的错误可能是由循环依赖引起的。例如,是否PlayerController.h包含对Player没有前向声明的类的引用?

于 2013-07-17T04:38:47.720 回答
0

源代码控制是关键。根据您的评论和额外代码,请同时发布 player.h 内容。

一般来说,在这种可怕的情况下,我会通过注释掉项目的大部分来进行二进制搜索。

包含在几个 cpps 中的 h 文件中的错误通常更有可能从一个小错误中产生大量错误。cpp 解析问题仅影响 cpp。在 h 文件中查找错误。

还有一般的建议,尽量将所有 h 文件引用保留在 cpp 文件中,并将 h 文件对 h 文件的引用限制在绝对最小值,这将减少包含噩梦。如您所见, player.h 包含大量 h 文件。它们中的每一个都可能是罪魁祸首,我建议一一评论它们并等待有关未定义符号的错误,而不是您现在看到的错误。这将意味着您不再有解析错误并且现在缺少定义(因此错误出现在您注释掉的文件中或它包含的文件之一中......)。

于 2013-07-17T04:18:55.080 回答