我正在将静态库(assimp)合并到现有项目(Spring RTS)中,其中库和项目都在定期开发中。我正在尝试以这样的方式添加库,以便在新版本发布时我可以轻松地重复集成。
无论如何,问题是Spring要求库使用streflop数学库执行所有数学运算。在实践中,这意味着min(x,y)
应该被streflop::min(x,y)
替换为任何地方(考虑到问题适用于所有数学函数,这很多)。
我可以做一个大规模的正则表达式替换,但我希望有一些更优雅的东西。经过一些研究和测试后,似乎在每个.cpp文件的顶部添加using namespace streflop;
可以解决问题,但事实并非如此。
确切的错误是:
/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的引用感到有些困惑。这是一个嵌套的命名空间,这可能是它没有按预期工作的部分原因吗?
答案 0 :(得分:7)
如果您只需要min
命名空间中的streflop
函数,则可以使用
using streflop::min;
而不是
using namespace streflop;
这将仅导入名称min
,而不是整个命名空间。
您的错误是因为您正在执行的操作从streflop
命名空间导入每个名称,以便它们可以使用不合格,并且sqrtf
已经存在不合格。您是否可能包含C头文件,因为它们在C中?也就是说,使用math.h
代替cmath
?因为如果使用像cmath
这样的C ++头文件,标准库中的函数将位于std
命名空间中,即使导入整个streflop
命名空间也不会出现冲突
另一种选择是,如果您现在收到错误的地方很少,您可以明确限定它们。与此情况类似,您可以将sqrtf
替换为streflop::sqrtf
或::sqrtf
,具体取决于您要使用的版本。
streflop::Simple
与您的问题关系不大;它只是streflop::sqrtf
的参数类型和返回值。它涉及的唯一方法是在重载决策中它被视为float
,因此列出的sqrtf
个函数都可以调用,编译器无法确定你的意思。