【发布时间】:2020-06-07 12:52:36
【问题描述】:
我有一些使用嵌套命名空间编写的 C++ 库。这些库使用许多数学函数,为了便于阅读,最好在不明确指定命名空间的情况下阅读这些函数。现在,代码的简化版本如下所示。
namespace Base::Sibling1 {
float cos(float x) { return cosf(x); }
};
namespace Base::Sibling2 {
using namespace Sibling1;
float f(float x) { return cos(x); }
};
我们想转而使用更扁平的命名空间,主要是为了更容易使用兄弟代码扩展库。我们曾希望像这样的简单更改会起作用:
namespace Sibling1 {
float cos(float x) { return cosf(x); }
};
namespace Sibling2 {
using namespace Sibling1;
float f(float x) { return cos(x); }
};
因为 Sibling2::f() 调用 cos(x) 现在是模棱两可的,所以现在失败了。
我有两个问题
- 为什么现在模棱两可,而不是第一个版本?
- 是否可以在使用
using Sibling1::cos明确列出所有函数的情况下获得我们之前的行为?
【问题讨论】:
-
我会亲自删除
using namespace Sibling1;并明确调用Sibling1::cos。 -
我只能用 GCC 重现您的错误。 Clang 和 MSVC 接受您的第二个 sn-p。可能只是一个错误。编辑:Clang 10 也拒绝它。很有趣。
-
如果您有两个
using指令 - 即using namespace std和using namespace Sibling1和<cmath>被包括在内,那么std::cos()和Sibling1::cos()都同样适用于return cos(x)- 因此模棱两可。如果您希望Sibling2::f()调用Sibling1::cos(),则唯一避免这种情况的方法是删除using namespace std或显式命名您想要的函数(即return Sibling1::cos())。一旦使用了 using 指令,它的效果就无法在该编译单元中撤消(即没有类似于cancel_previous_using namespace std的东西)。
标签: c++ namespaces