我刚注意到这一点。我不知道为什么会这样,如果我使用命名空间中的一个元素,我不想在不使用命名空间的情况下访问其他任何内容。例如,此代码有效:
namespace Test
{
struct Magic
{
int poof;
};
struct Magic2
{
int poof;
};
int Alakazam(const Magic& m)
{
return m.poof;
}
int Alakazam(const Magic2& m)
{
return m.poof;
}
};
using Magic = Test::Magic;
int main()
{
Alakazam(Magic()); // valid
Alakazam(Test::Magic2()); // valid
Test::Alakazam(Magic()); // what i want to only be valid
Test::Alakazam(Test::Magic2()); // this too
}
这背后的任何推理?规范是否表明这必须是真的?
答案 0 :(得分:2)
正如评论中immbis所建议的那样,这是由标准定义的:
3.4.2:参数依赖名称查找
- 醇>
当函数调用中的postfix-expression是unqualified-id时,通常不会考虑其他名称空间 可以搜索非限定查找,并在这些名称空间中, 命名空间范围的朋友函数或函数模板声明没有 否则可见。这些对搜索的修改 取决于参数的类型(以及模板模板) 参数,模板参数的命名空间)。
...
如果你想打败这种机制,你必须使用这样的嵌套命名空间,但这很棘手:
namespace Test
{
struct Magic
{
int poof;
};
struct Magic2
{
int poof;
};
namespace Test2 { // use a nested namespace that will not be searched autoamtically
int Alakazam(const Magic& m)
{
return m.poof;
}
int Alakazam(const Magic2& m)
{
return m.poof;
}
}
using namespace Test2; // but give some access to the enclosing namespace
};
Live Demo:然后,您的两个首次通话将不再有效。但是,您的示例中的最后一次调用仍然可能:您无法阻止在命名空间之外使用完全限定名称。