【问题标题】:type redefinition error when including 2 header files包含 2 个头文件时类型重新定义错误
【发布时间】:2012-01-24 08:49:35
【问题描述】:

我正在编译一个Matlab mex文件(在Windows下使用VS2010),以下2个包括:

#include <algorithm> // for std::copy
#include "mex.h"

给我编译错误:

1>d:\svn\trunk\dev\matlab\extern\include\matrix.h(337): 错误 C2371: 'char16_t' : 重新定义;不同的基本类型

我已经尝试将它放在一个命名空间中:

namespace Algo {    
    #include <algorithm>
}

然后我得到大量其他编译错误,甚至没有使用&lt;algorithm&gt; 中定义的任何内容,例如:

Error   1   error C2039: 'set_terminate' : is not a member of '`global namespace''  C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception    192
Error   2   error C2873: 'set_terminate' : symbol cannot be used in a using-declaration C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\exception    192

我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试过相反的方法,即尝试将 mex 标头放在命名空间中?阅读标题,并找到冲突。通常可以定义一个符号来规避它。
  • 它有效,谢谢。把它放在一个答案中,我会很高兴接受它..顺便说一句,为什么它反过来不起作用?

标签: c++ visual-studio-2010 matlab mex


【解决方案1】:

将标准头文件放在命名空间中听起来不是一个好主意,即使您没有使用其中的任何方法或类,但另一个头文件(如 mex.h)很有可能.将命名空间放在 mex 标头周围似乎不太可能造成冲突。

在另一个之前包含一个标题也可以防止这种冲突。一些标头考虑到某些符号在重新定义之前可能已经定义(库开发人员确实应该注意这样做)

在某些情况下,阅读标题也可以让您很好地了解正在发生的事情。有时它可能就像定义一个符号一样简单,它告诉标题跳过重新定义。

【讨论】:

  • “有时它可能就像定义一个符号一样简单......” - 但问题不正是符号已经定义了吗?
  • 但有时有问题的头文件的定义可能包含在以下内容中:#ifdef if_vs_algorithm_used 或者一些符号告诉头文件使用了哪个版本的 std 库。
猜你喜欢
  • 2018-09-21
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
相关资源
最近更新 更多