我将静态库(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/