3

我使用带有 Visual Studio 2010 的 Win7 系统。我使用的是 OpenCV,并且有一个嵌入式 flann 命名空间。

但我也使用了一个原始的 FLANN 包http://people.cs.ubc.ca/~mariusm/index.php/FLANN/FLANN

我按照用户手册使用

> "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
> cd flann-x.y.z-src
> mkdir build
> cd build
> cmake -G "NMake Makefiles" ..

我在我的 VS2010 项目中添加了 FLANN 文件夹:c++ 文件夹->包含目录

因此,当我编写 C++ 代码并想使用“flann”命名空间时,会出现命名空间冲突错误。

我该如何解决这个问题?

4

2 回答 2

2

可能最可靠的解决方案是重命名命名空间之一。你说你已经编译了flann——在这种情况下,你可以重命名它的命名空间,然后重新编译。

也许您可以通过少量修改重用Boost.BCP 工具- 它具有命名空间重命名功能。

或者,如果您在flann- 中看到一些常见模式,那么您可以尝试通过简单的全局搜索和替换来重命名它。重命名后,请diff确保只重命名需要的部分,并grep确保重命名所有需要的位置。


另一种选择是在编译期间定义预处理器宏,flann它会重命名命名空间,例如:

#define flann flann_vanilla

并将其添加到编译器选项中,例如:

-Dflann=flann_vanilla

在这种情况下,您应该将每个flann标头包含在:

#define flann flann_vanilla
#include "flann.hpp"
#undef flann

此外,如果那些重复的命名空间来自同一个库(可能是不同的版本) - 请注意可能的预处理器宏冲突,尤其是包含保护的冲突。包含守卫冲突的最简单解决方案是使用特定于实现的#pragma once.

于 2013-04-11T23:04:18.077 回答
0

将现有的 'flann' 命名空间包装在一个新的命名空间中,然后使用完全限定的语法来引用它。

于 2013-04-11T23:08:17.033 回答