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

  • 相关阅读:
    PAT 1010. 一元多项式求导 (25)
    PAT 1009. 说反话 (20) JAVA
    PAT 1009. 说反话 (20)
    PAT 1007. 素数对猜想 (20)
    POJ 2752 Seek the Name, Seek the Fame KMP
    POJ 2406 Power Strings KMP
    ZOJ3811 Untrusted Patrol
    Codeforces Round #265 (Div. 2) 题解
    Topcoder SRM632 DIV2 解题报告
    Topcoder SRM631 DIV2 解题报告
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314046.html
Copyright © 2011-2022 走看看