命名空间、类和编译器顺序
Posted
技术标签:
【中文标题】命名空间、类和编译器顺序【英文标题】:Namespace, class and compiler order 【发布时间】:2015-05-18 18:25:30 【问题描述】:我正在使用 OpenGL,我构建并编辑了一个 Vector3 标头,该标头可以完美地与 struct Vector3
一起使用,但是当我尝试创建 Vector3 zero = Vector3(0,0,0)
变量时问题就开始了,编译器不允许我构建到编译顺序,所以我从 Internet 复制了一个新的 Vector3 库,我收到了这个错误:"Vector3 does not name a type"
。我想是导致编译顺序的原因,我将分享我得到错误的地方和库。首先这是我正在使用的两个文件http://leetnightshade.com/c-vector3-class 我只使用 Vector3.cpp 和 Vector3.h,这段代码是我制作的,是我得到错误的地方(这是一个由 main 调用的头文件.cpp 文件名为 GameObject.h):
#include "Vector3.h"
GLfloat cube[] =
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
;
GLfloat Space3D_X[] =
0.0f, 0.0f, -100,
0.0f, 0.0f, 100
;
GLfloat Space3D_Y[] =
-100.0f, 0.0f, 0.0f,
100.0f, 0.0f, 0.0f
;
typedef struct GameObject
int ID, parent;
Vector3 position; ///<<<--------------------------HERE I GET THE ERROR VECTOR3 DOES NOT NAME A TYPE
Quaternion rotation;
;
struct GameObject GameObjects[65536];
class Natives
public:
int GameObjectsCount = 0;
inline int CreateCube (Vector3 _position, Quaternion _rotation, int _parent)
GameObjects[GameObjectsCount].ID = GameObjectsCount;
GameObjects[GameObjectsCount].parent = _parent;
GameObjects[GameObjectsCount].position = _position;
GameObjects[GameObjectsCount].rotation = _rotation;
GameObjectsCount ++;
return GameObjectsCount-1;
inline void SetGameObjectParent (int _gameObject, int _parent)
Vector3 _tempPos = GameObjects[_gameObject].position;
Quaternion _tempRot = GameObjects[_gameObject].rotation;
GameObjects[_gameObject].parent = _parent; /*** ATTACH GM TO OTHER GM WITHOUT CHANGE POSITION ***/
GameObjects[_gameObject].position.x = -(GameObjects[_parent].position.x - _tempPos.x); /*** IF YOU WANT TO ATTACH IT CHAING POSITION JUST ***/
GameObjects[_gameObject].position.z = -(GameObjects[_parent].position.z - _tempPos.z); /*** OVERWRITE THE PARENT WITH OOP SYNTAX ***/
GameObjects[_gameObject].rotation.rx = _tempRot.rx;
GameObjects[_gameObject].rotation.ry = _tempRot.ry;
GameObjects[_gameObject].rotation.rz = _tempRot.rz;
;
Natives native;
关注 struct GameObject 的 4 行,这是我在 Vector3 位置得到错误的地方;线。我想我正确地解释了自己。如果您不太了解http://gyazo.com/77189bef5576b047de5271f1b7d2d881,我制定了一个方案。感谢阅读。
【问题讨论】:
【参考方案1】:你链接的Vector3
库使用命名空间_Warp
,所以你应该这样使用它:
_Warp::Vector3 position;
PS:警惕任何使用保留名称作为标识符的第三方库,因为编写者可能不知道他们在做什么。 _Warp
是编译器的保留名称(以_
加大写字母开头),不应由库或程序代码使用。
【讨论】:
非常感谢它有效!所以将变量定义为 Vector3 的唯一方法是 _Warp::Vector3?或者我可以创建一个快捷方式来避免 _Warp? @tonyperez:您也可以在#include "Vector3.h"
行之后写use namespace _Warp;
。但是在头文件中use namespace
被认为是不好的做法。
那么,删除的唯一方法就是这样,而且是个坏主意,没有其他方法了吗?
@tonyperez:好吧,如果许可证允许,您可以从原始源代码中编辑掉namespace _Warp
行(小心没有许可证的共享代码......)。无论如何我不会太在意它,只要习惯命名空间的东西,你就会学会欣赏它。以上是关于命名空间、类和编译器顺序的主要内容,如果未能解决你的问题,请参考以下文章