我将静态库(assimp)合并到现有项目(Spring RTS)中,在该项目中,库和项目均处于定期开发中。我正在尝试以一种方式添加库,以便在新版本发布时可以轻松地重复进行集成。

无论如何,问题在于Spring要求该库使用streflop数学库执行所有数学运算。实际上,这意味着在使用min(x,y)的任何地方都应将streflop::min(x,y)替换为using namespace streflop;(这很多,考虑到此问题适用于所有数学函数)。

我可以进行大量的正则表达式替换,但我希望有一些更优雅的东西。经过一些研究和测试,似乎在每个.cpp文件的顶部添加ojit_code可以达到目的,但事实并非如此。

确切的错误是:

/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/code/FixNormalsStep.cpp:147: error: call of overloaded sqrtf(const float&) is ambiguous
/usr/include/bits/mathcalls.h:157: note: candidates are: float sqrtf(float)
/mnt/work/workspace/spring-patch-git/spring/rts/lib/streflop/SMath.h:347: note:                 streflop::Simple streflop::sqrtf(streflop::Simple)

我以为命名空间的全部目的是解决这种问题,但似乎在这里不起作用。我对streflop::Simple的引用也感到困惑。这是一个嵌套的 namespace ,这可能是它无法按预期运行的原因的一部分吗?

最佳答案

如果只需要min命名空间中的streflop函数,则可以使用

using streflop::min;

代替
using namespace streflop;

这将仅导入名称min,而不导入整个 namespace 。

您的错误是因为您正在执行的操作会从streflop命名空间导入每个名称,以便可以不加限定地使用它们,而sqrtf已经不合格。您是否可能像在C中一样包含C头文件?也就是说,使用math.h而不是cmath吗?因为如果使用像cmath这样的C++头文件,则标准库中的函数将位于std命名空间中,即使导入整个streflop命名空间也不会有冲突。

另一个选择是,如果您现在从那里得到错误的位置很少,则可以明确限定它们的位置。像在这种情况下一样,您可以将sqrtf替换为streflop::sqrtf::sqrtf,这取决于要使用的版本。
streflop::Simple与您的问题无关;它只是streflop::sqrtf的参数类型和返回值。涉及的唯一方法是在重载解析中将其像float一样对待,以便列出的两个sqrtf函数都可以调用,并且编译器无法确定您的意思。

关于c++ - 使用命名空间解决C++中的歧义调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1994258/

10-11 18:43