在一个学术项目中,我正在尝试设置一个简单的物理引擎。 我正在使用 Eigen 库进行 vector/矩阵计算。 我希望尽可能独立于我所做的库/设计选择,以方便将来的更改,因此我对 Eigen 类型使用 typedef。
文件PhysicsEngine.h
#pragma once
#include <Eigen/Core>
#include <Eigen/Geometry>
#include "RigidBody.h"
... other inclusions ...
namespace PhysicsEngine
{
typedef float real;
typedef Eigen::Vector3f vector3;
typedef Eigen::Quaternionf quaternion;
typedef Eigen::Matrix4f matrix4;
typedef Eigen::Matrix3f matrix3;
...
1)这是一个好的设计选择还是我误解了老师告诉我们的内容?
在 RigidBody.h 中包含上面的文件,并尝试使用这些 typedef:
#pragma once
#include "PhysicsEngine.h"
namespace PhysicsEngine
{
class RigidBody
{
public:
vector3 position; // <- error C4430
real inverseMass; // <- error C4430
vector3 velocity; // <- error C4430
vector3 netForce; // <- error C4430
quaternion orientation; // <- error C4430
matrix3 inverseInertiaTensor; // <- error C4430
vector3 rotation; // <- error C4430
vector3 netTorque; // <- error C4430
matrix4 transformationMatrix; // <- error C4430
...
我得到:
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int.
2)我在这里做错了什么?
提前致谢。
最佳答案
Is that a good design choice or am I misunderstanding what my teacher told us?
这可能是一个糟糕的设计选择,因为您隐藏了您正在使用特征类型的事实,但是您需要知道这个事实才能使用您的 typedef。
I get a lot of errors C4430.
这样的描述真的让我很恼火。您的编译器不仅会因“错误 C4430”而终止,它还会为您提供详细的错误信息,这对于查找问题的原因至关重要。如果不分享此信息,任何人都很难为您提供帮助。您能否发布第一个完整消息以及导致错误的代码行?
错误数量无关紧要,因为大多数错误很可能源自同一问题。
由于 Microsoft 的警告 C4430 读取“缺少类型说明符 - int 假定”,我怀疑您忘记包含 Eigen 头文件,以便编译器不知道 Eigen::Vector2f
是什么。是。
尝试添加#include <Eigen/Core>
至PhysicsEngine.h
.
根据您更新的代码:您有循环依赖项。 PhysicsEngine.h
包括RigidBody.h
反之亦然。这不好。
我怀疑编译时RigidBody.cpp
,编译器最终将解析 RigidBody.h
中的类定义。在 PhysicsEngine.h
中的 typedef 之前,以便您的自定义 typedef 此时不可用。
您可能应该删除 RigidBody.h
包括来自 PhysicsEngine.h
,或将您的 typedef 移动到单独的头文件中。
关于c++ - Eigen 类型 typedef 因 C4430 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989186/