关于MFC下使用MTL库编译错误的问题

在使用Matrix Template Library(MTL)库进行矩阵运算还是很给力的,但是遇到了一个比较悲剧的问题就是,在控制台程序中一切完美,而在MFC下使用该库会编译不过去,(编译环境VS2005SP1,VS2008下貌似没有这个问题)。

在MFC下编译,提示下面错误

   1: 1>------ 已启动生成: 项目: TestUI, 配置: Debug Win32 ------
   2: 1>正在编译...
   3: 1>stdafx.cpp
   4: 1>正在编译...
   5: 1>TestUI.cpp
   6: 1>TestUIDlg.cpp
   7: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(45) : warning C4003: “max”宏的实参不足
   8: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(45) : error C2027: 使用了未定义类型“VectorT”
   9: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(45) : error C2226: 语法错误 : 意外的“VectorT”类型
  10: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(45) : error C2988: 不可识别的模板声明/定义
  11: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(45) : error C2059: 语法错误 : “)”
  12: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(45) : error C2059: 语法错误 : “)”
  13: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(48) : error C2653: “VectorT”: 不是类或命名空间名称
  14: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(49) : warning C4003: “min”宏的实参不足
  15: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(49) : error C2988: 不可识别的模板声明/定义
  16: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(49) : error C2059: 语法错误 : “)”
  17: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl_decl.h(49) : error C2059: 语法错误 : “)”
  18: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(739) : warning C4003: “max”宏的实参不足
  19: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(739) : error C2027: 使用了未定义类型“VectorT”
  20: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(739) : error C2226: 语法错误 : 意外的“VectorT”类型
  21: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(739) : error C2988: 不可识别的模板声明/定义
  22: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(739) : error C2059: 语法错误 : “)”
  23: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(739) : error C2059: 语法错误 : “)”
  24: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(753) : error C2653: “VectorT”: 不是类或命名空间名称
  25: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(754) : warning C4003: “min”宏的实参不足
  26: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(754) : error C2988: 不可识别的模板声明/定义
  27: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(754) : error C2059: 语法错误 : “)”
  28: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(754) : error C2059: 语法错误 : “)”
  29: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(755) : error C2143: 语法错误 : 缺少“;”(在“{”的前面)
  30: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(755) : error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
  31: 1>c:/work/3rdpart/mtl-2.1.2-22/mtl/mtl.h(1295) : warning C4003: “min”宏的实参不足
  32: 1>正在生成代码...
  33: 1>生成日志保存在“file://c:/Work/LT_Image/ImD/TestUI/BuildLog.htm”
  34: 1>TestUI - 20 个错误,5 个警告
  35: ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

提示错误的代码如下:

   1: template <class VectorT>
   2: inline typename VectorT::value_type
   3: max(const VectorT& x);
   4:  
   5: template <class VectorT>
   6: inline typename VectorT::value_type
   7: min(const VectorT& x);
   8:  

究其原因,max和min在windows的头文件中已经被定义为宏了,所以mtl中这两个函数和已经定义的发生了冲突,找到原因,修改应该就知道怎么修改了,第一,将max和min两个函数名称换掉,但是这个工程量貌似比较大,需要将mtl库中所有用到max和min的都换掉;第二,使用宏将其定义取消掉,代码如下:

   1: namespace mtl
   2: {
   3:     #ifdef max
   4:     #undef max
   5:     #endif
   6:  
   7:     #ifdef min
   8:     #undef min
   9:     #endif
  10: }

将上面的代码加到stdafx.h中,就可以解决这个问题了,这样做的确比较简单,目前还不清楚有没有其他的副作用,如果有,请大家告诉我,谢谢。

原文地址:https://www.cnblogs.com/xiaowangba/p/6314046.html