关于VS项目中添加第三方库出现error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 错误的解决方法
最近由于在已有项目中进行一些矩阵运行与线性代数计算,因此添加了第三方开源库Eigen,由于Eigen相关的代码是由同事编写的。将其移植到现有项目中时在包含Eigen的头文件后,项目就出现了68个相关错误,如标题所示的错误。
#include <Eigen/Dense>
错误主要指向Meta.h和JocabiSVD.h两个头文件,其中Meta.h错误指向658行,如下所示代码
template <typename T>
struct has_ReturnType
{
template <typename C> static meta_yes testFunctor(C const *, typename C::ReturnType const * = 0);//658行
template <typename C> static meta_no testFunctor(...);
enum { value = sizeof(testFunctor<T>(static_cast<T*>(0))) == sizeof(meta_yes) };
};
JocabiSVD.h错误指向356行,如下代码所示
template<typename MatrixType, int QRPreconditioner>
struct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, false>
{
typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;//356行
typedef typename MatrixType::RealScalar RealScalar;
static bool run(typename SVD::WorkMatrixType&, SVD&, Index, Index, RealScalar&) { return true; }
};
经过上网搜索相关错误提示是出现标题所示错误主要是由于两个类的头文件相互包含造成的,按照该思路进行检查,将相关出现两个类相关包含的均进行了注释发现问题仍然没有解决,经过反复查询并咨询同事,最后找到问题所在。
添加第三方库出现标题所示错误其主要原因是原项目代码中定义的宏与第三方库中定义的变量出现冲突
例如本项目中再Meta.h和JocabiSVD.h两个头文件中出现的错误均因为该问题,在Meta.h的658行定义的C与我原项目程序中定义的宏光速C冲突,导致该处报错。JocabiSVD.h的356行定义的SVD与原项目中定义的宏SVD冲突。
将上述两处冲突的宏进行修改后项目编译通过,总结出现相关问题主要原因就是原项目定义的变量与第三方库中的变量冲突导致,因此在定义宏时一定要注意不要定义的太普通容易出现冲突,尽量定义的特殊一些以防与第三方库变量冲突