请教矩阵类模板SP++报二义性错误的问题

sapphire 发布于 2012/07/11 22:09
阅读 307
收藏 0

@张明 你好,想跟你请教个问题:

为什么我在同一个工程下的两个不同.cpp文件前面都加上#include<inverse.h>之后(但是它们是不同的类,各自都需要调用求逆inv()和求行列式dec())就会报链接错误啊
说"fatal error LNK1169: 找到一个或多个重定义的符号"
在生成目标文件的时候会有error LNK2005: "public: void _thiscall 
splab::Cholesky<class std::complex<float> >::dec()。。。
但是matrix.h和vector.h加上就没有问题,而且我看了inverse.h的头文件也有防止重复包含的预编译头,这是为什么啊?求指导

谢谢了!感激不尽!

编译环境是VS2008,我又看了你写的文档里说把复数矩阵的广义逆函数pinv改为cpinv,我在pseudoinverse.h和pseudoinverse-impl.h里面都改了还是不行。。。

而且报错的地方是关于Cholesky的。。。不知道为什么

加载中
0
B
BurtonMan

找到一个或多个重定义的符号,是由于两个实现文件中重复包含了头文件而造成的,在工程中多次引用,就会造成这个错误。我们一般在头文件中加入#ifndef……#endif这样的预编译命令。但有时这个错误依然不能消除,解决办法如下:

1.在一个头文件中的相同函数和变量的声明前加上extern 关键字即可,他们使用的是同一个实体,且声明和实现分开

2.如果涉及模板类文件,模板类函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码。模板仅在需要的时候才会具现化出来,所以,当编译器只看到模板的声明时,它不能具现化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。

因为类模板不支持分离只能是类的声明和定义放在同一个文件中,所以在sp++代码中,在声明的最后面加上实现的头文件,这相当于在一个头文件当中。此时,sp++源码中就多了一个问题,在编写模板类时,加入了实例化的程序,如utilities.h中的mod。这样,如果你在不同程序文件中引用相同头文件时,会大量出现在xxx.obj中已经定义的错误,如何解决呢

a.整个工程文件中对涉及包含实例化函数的文件头,只能#include一次

b.将源代码中的实例化函数写成模板

最后,来个总结:sp++代码不算是很优秀的代码,需要增加和修改的地方太多了,本人就大量修改了。

首先,模板编程中,就应该纯粹的模板,不要加入实例化的函数。

其次,基础模板类实现后,不使用模板的功能性代码,还是要将声明和实现分开放。

最后,本人水平也有限,有什么不足的地方或错误的地方,批评之余给个建议。

建议:可以参考Eigen开源代码进行对源代码改良!

返回顶部
顶部