0

好的,对该问题进行一些介绍:我正在使用在Windows 7 - 64 位操作系统上运行的Visual Studio 2012中的C++/DirectX11中的 C++/DirectX11 中的渲染引擎(以 32 位模式编译),并且出现了一个奇怪的链接错误我的班级(Entity3D就像场景的基本演员)。 我所有的包围体类都继承自一个Shape3D类。每个实体都有一个Shape3D * boundingVolume 成员,它在初始化时被初始化为特定的形状类型。当两个Shape3D 之间发生碰撞时,我通过一个函数传递它们 -然后该函数检查它们的类型(球体Entity

bool Intersect(Shape3D* a, Shape3D* b)/*Box*/Whatever) 类型表示一个数字,它是函数指针数组中函数的索引:

bool(*IntersectArray[4][4])(Shape3D* a, Shape3D* b) = 
{
    {
        IntersectSphereSphere,
        IntersectSphereBox,
        IntersectSphereOrientedBox,
        IntersectSphereFrustum,
    },
    {
        IntersectBoxSphere,
        IntersectBoxBox,
        IntersectBoxOrientedBox,
        IntersectBoxFrustum
    },
    {
        IntersectOrientedBoxSphere,
        IntersectOrientedBoxBox,
        IntersectOrientedBoxOrientedBox,
        IntersectOrientedBoxFrustum
    },
    {
        IntersectFrustumSphere,
        IntersectFrustumBox,
        IntersectFrustumOrientedBox,
        IntersectFrustumFrustum
    }
};

所以它就像一个虚拟调度。好的,这InersectArray是函数的数组(在 Intersect.h 中声明),这就是给我链接错误的原因:

error LNK1169: one or more multiply defined symbols found
error LNK2005: "char (__cdecl*(* Engine::Collision::IntersectArray)[4])(class Engine::Collision::Shape3D *,class Engine::Collision::Shape3D *)" (?IntersectArray@Collision@Engine@@3PAY03P6ADPAVShape3D@12@0@ZA) already defined in Entity3D.obj
File Intersect.obj

Intersect.h仅包含在Entity3D.cpp中,不包含在Entity3D.h中,也不包含在 Entity3D.h 包含的任何标Entity3D.cpp仅包括Entity3D.hIntersect.h。我清理并重建,错误仍然存​​在。Intersect(Shape3D a, Shape3D* b)* 仅在Entity3D.cpp文件中的Entity3D的一种方法中调用。项目中当前没有其他编译错误或警告。还有什么可能导致这样的问题?

4

1 回答 1

0

修复了这个问题,我只是在Intersect.cpp文件中移动了IntersectArray的定义,因为现在这是唯一需要它的地方。

于 2013-03-27T21:00:50.827 回答