C++ 如何解决C++;?

C++ 如何解决C++;?,c++,namespaces,C++,Namespaces,我在VisualStudio2010中使用Win7系统。我使用的是OpenCV,有一个内嵌的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项

我在VisualStudio2010中使用Win7系统。我使用的是OpenCV,有一个内嵌的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”命名空间时,命名空间冲突错误。


如何解决此问题?

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

也许你可以稍加修改就重用它——它有名称空间重命名功能

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


另一个选项是在编译
flann
时定义预处理器宏,该宏将重命名名称空间,如:

#define flann flann_vanilla
并将其添加到编译器选项中,如:

-Dflann=flann_vanilla
在这种情况下,您应该将每个
flann
标题的包含包装为:

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


另外,如果这些重复的名称空间来自同一个库(可能是不同的版本),请注意可能的预处理器宏冲突,特别是include-guard的冲突。include guards clash最简单的解决方案是使用一次特定于实现的pragma

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

在代码中的任何地方都有
使用命名空间
吗?问题是,我必须同时使用opencv命名空间和flann命名空间。但opencv中也有一个flann.hpp。所以“flann”是冲突。你应该使用两种不同版本的flann吗?很难说出你在说什么。当您说存在名称空间冲突错误时,这是编译器错误吗?你能从输出窗口(不是只有摘要的错误窗口)向我们展示整个错误消息吗?@Aesthete:大概他不想使用OpenCV Flann,而是用另一个替换它。你的意思是,最好的方法是,我修改Flann的源代码并重新编译它?是的,没错。我不知道有什么更好、更可靠的解决方案可以做到这一点。也许您可以找到解决某些问题的方法,但请注意,由于两者使用相同的命名空间名称,翻译单元和结果之间可能存在符号冲突。