我在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(它太长了,不适合这里)
根据要求:
Player.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);
}
};
Globals.h
#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;
};
答案 0 :(得分:4)
滚动到错误列表的顶部,然后处理该错误列表。如果您在Visual Studio中,则可以编译它并按Ctrl-Shift-F12。
如果你在语法上犯了一些错误(我通常的一个是无法匹配的引号或括号),编译器可能会失去它的上下文,所以从那一点开始的一切都变得难以理解。您将通过唯一方式来纠正发现的第一个错误;然后 - 如果仍有错误 - 下一个。在某些时候,你会发现你所做的事情,其余的错误将神奇地消失。
答案 1 :(得分:2)
欢迎来到精彩的c ++错误世界。
当面对这样的事情时,从报告的第一个错误开始(查看编译器的输出)。然后重新编译。重复,直到没有错误。
有很多不同的语法错误会完全破坏文件的其余部分。这些包括声明中的错误类型,缺少分号和缺少大括号。
我看到超过200个错误因一个字符修复而消失。
此外,如果您在一个头文件中忘记了分号或括号,则可能会在下一个包含的标题中导致错误。我在windows.h中遇到了非常糟糕的错误,因为我在它之前已经包含了我的标题并忘记了某些内容。
答案 2 :(得分:1)
当您转储(带注释的)预处理输出并查看编译器获取的信息时,解决棘手的编译器错误问题(例如您所描述的问题)会变得更容易 。 cl.exe
获取/E
参数,以便将预处理的输出转储到stdout(see also this SO answer)。如果您使用它,并查看该上下文中的错误,则应该清楚。
像'Player': undeclared identifier
这样的错误显示在您认为您正在定义该标识符的文件中,可能是由循环依赖引起的。例如,PlayerController.h
是否包含对Player
类的引用而没有前向声明?
答案 3 :(得分:0)
源控制是关键。根据您的评论和额外代码,请发布player.h内容。
一般来说,在这种可怕的情况下,我会通过评论项目的大部分来进行二分查找。
包含在几个cpp中的h文件中的错误通常更容易因为一个小错误而产生大量错误。 cpp解析问题仅影响cpp。在h文件中查找错误。
同样一般的建议,尝试将所有h文件引用保留在cpp文件中,并将h文件中对h文件的引用限制为绝对最小值,这将减少包括恶梦。如你所见,player.h包含大量的h文件。他们中的每一个都可能是罪魁祸首,我建议逐个对它们进行评论并等待有关未定义符号的错误,而不是您现在看到的错误。这意味着您不再有解析错误,现在缺少定义(因此错误发生在您注释掉的文件中或包含在其中的某个文件中...)。