在使用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中,就可以解决这个问题了,这样做的确比较简单,目前还不清楚有没有其他的副作用,如果有,请大家告诉我,谢谢。