由于使用了One Type Inside,命名空间设置为Used?

时间:2016-01-14 22:10:26

标签: c++ namespaces

我刚注意到这一点。我不知道为什么会这样,如果我使用命名空间中的一个元素,我不想在不使用命名空间的情况下访问其他任何内容。例如,此代码有效:

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
}

这背后的任何推理?规范是否表明这必须是真的?

1 个答案:

答案 0 :(得分:2)

正如评论中immbis所建议的那样,这是由标准定义的:

  

3.4.2:参数依赖名称查找

     
      
  1. 当函数调用中的postfix-expression是unqualified-id时,通常不会考虑其他名称空间   可以搜索非限定查找,并在这些名称空间中,   命名空间范围的朋友函数或函数模板声明没有   否则可见。这些对搜索的修改   取决于参数的类型(以及模板模板)   参数,模板参数的命名空间)。

         

    ...

  2.   

如果你想打败这种机制,你必须使用这样的嵌套命名空间,但这很棘手:

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:然后,您的两个首次通话将不再有效。但是,您的示例中的最后一次调用仍然可能:您无法阻止在命名空间之外使用完全限定名称。