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