代码之家  ›  专栏  ›  技术社区  ›  SpliFF

用名字空间解决C++中的模糊调用

  •  1
  • SpliFF  · 技术社区  · 16 年前

    无论如何,问题是Spring要求库使用streflop数学库执行所有数学运算。实际上,这意味着 min(x,y) streflop::min(x,y) 无论在何处使用它(考虑到该问题适用于所有数学函数,这一点非常多)。

    我可以做一个大规模的正则表达式替换,但我希望有一些更优雅的东西。经过一些研究和测试,似乎 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的引用也有点困惑。这是一个嵌套的名称空间吗?这可能是它不能按预期工作的部分原因吗?

    1 回复  |  直到 16 年前
        1
  •  8
  •   JaakkoK    16 年前

    如果你只需要 min 功能来自 streflop 命名空间,您可以使用

    using streflop::min;
    

    而不是

    using namespace streflop;
    

    ,而不是整个命名空间。

    streflop 命名空间,以便可以使用它们,以及 sqrtf 已经存在不合格。您是否像在C中一样包含C头文件?即使用 math.h 而不是 cmath 数学库 ,标准库中的函数将位于 std 命名空间,即使导入整个 命名空间。

    另一个选择是,如果您现在从中获得错误的地方很少,您可以显式地限定它们。就像在这种情况下,您可以替换 sqrtf 两者都有 streflop::sqrtf ::sqrtf ,具体取决于要使用的版本。

    这个 streflop::Simple 与你的问题无关;它只是的参数类型和返回值 streflop::sqrtf . 它涉及的唯一方式是,在重载解析中,它被当作 float 所以两个 列出的函数可以调用,编译器无法确定您所指的函数。