【发布时间】:2012-03-10 04:55:45
【问题描述】:
我正在制作一个物理引擎(借助一本书),这本书建议我为引擎创建一个命名空间,并在第一部分为变量声明一个“typedef”,例如所以
typedef float real;
我可以理解作者给出的解释是“如果需要更改精度,那么您可以转到这一行并更改它,然后可能最多需要更改 10 个辅助函数,以及表示的清晰度,但我认为它与其他两件事不谋而合,所以我希望这是可以遵循的。
这本书要求我在一个文件中定义 typedef 和辅助函数(以在需要更改时最大限度地减少文件跳跃),然后在编译其他文件之前将其包含在内,并在命名空间中完成所有这些工作(我命名为 Physics),然后在另一个文件中创建要在引擎中使用的类。虽然直接的问题是智能感知,并且正在解决
genFunction.h
namespace Physics{
typedef float real;
}
Classes.h
#include "genFunction.h"
namespace Physics{
class Vector3{
public :
real x; // visual studio is throwing that Physics::real is not a type name
real y;
real z;
// VS is not offering collapsing, or any form of
// auto/assistance with lines.
// almost like it does not want me to have classes
// in my own namespaces
Vector3(){ // uncolapsable
x = 0;
y = 0;
z = 0;
}
};
}
考虑到编译器忽略了我已经完成了一个 typedef,并且它是问题发生的范围,以及当我在课堂上时 VS 甚至没有显示建议这一事实,我是否做错了什么在自制的命名空间中让我有些烦恼。
编辑:找到类型解析的主要解决方案。显然,我在其中一个方法上放置了( 而不是{,这导致它表现得好像整个命名空间都不存在。虽然 VS 仍然不会给我任何帮助(函数/类/命名空间折叠,或者即使使用 ctrl+空格键的完成建议)我也有一些我使用的辅助函数(自制 pow()、sqrt())我如果不在一个类中使用它会导致链接器错误,但是当我将它们内联时这就会消失。解析链接器是一件坏事吗?
【问题讨论】:
-
你检查过头文件的拼写吗?
"genfunction.h"或"genFunction.h"? -
这是一个概括,在我的代码中也是一样的。有问题更正
-
这里写的代码看起来不错。 IDE 无法识别它的事实可能意味着上游某处存在错字,该错字本身(不一定)是非法的,但会弄乱您的定义。首先,您可以尝试简单的干净重建,有时会有所帮助 - 如果没有,您可能需要发布更多代码。首先将相关位提取到您自己机器上的测试用例中。如果一个最小的例子重现它,我们可以提供更多帮助。如果最小示例没有重现它,那么您正在自己寻找问题的路上。
-
也许你已经知道这一点(并且你故意在你的代码 sn-ps 中忽略了它们),但你应该在你的头文件中使用 include 保护 (en.wikipedia.org/wiki/Include_guard) .随着您的项目变得越来越大,这种标准做法将为您节省各种痛苦。
-
@gardian06 :最好始终使用包含守卫,无论依赖项是什么。
FileA.h这个项目可能只有另一个文件依赖于它,但也许它会对另一个项目有更多的依赖。始终使用包含保护将使您的头文件更加面向未来并且更易于重用。
标签: c++ visual-studio-2010 namespaces typedef