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

时间:2010-01-03 07:50:26

标签: c++ namespaces

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

1 个答案:

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