gpt4 book ai didi

c++ - 使用 namespace 解决 C++ 中的不明确调用

转载 作者:行者123 更新时间:2023-11-30 00:42:04 26 4
gpt4 key购买 nike

我正在将一个静态库 (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 的引用也有点困惑。这是一个嵌套的命名空间吗?这可能是它没有按预期工作的部分原因吗?

最佳答案

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

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 函数都可以调用,编译器无法确定你调用的是哪一个意思是。

关于c++ - 使用 namespace 解决 C++ 中的不明确调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com