包含2个头文件时键入重定义错误

时间:2012-01-24 08:49:35

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

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

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

给我编译错误:

  

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

我尝试将其放在命名空间中:

namespace Algo {    
    #include <algorithm>
}

然后我得到了大量的其他编译错误,甚至没有使用<algorithm>中定义的任何东西,例如:

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在命名空间中放置一个标准的标题并不是一个好主意,即使你没有使用那里的任何方法或类,另一个标题很可能(如mex.h) 。将名称空间放在mex标题周围似乎不太可能产生冲突。

在另一个之前还包括一个标题也可以防止这种冲突。有些标题考虑到在重新定义它们之前可能已经定义了某些符号(库开发人员真的应该注意这样做)

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