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

  • 相关阅读:
    读取Web.config文件中的配置信息类
    屏蔽页面中的右键操作
    树型目录
    自己常用的分页SQL
    c#用一个线程同步的简单例子

    c++面向对象学习
    数据上传项目总结
    简单的xml学习
    c#中跨线程使用控件
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314046.html
Copyright © 2020-2023  润新知