【问题标题】:Why do i need NOT use the namespace?为什么我不需要使用命名空间?
【发布时间】:2015-02-10 14:40:05
【问题描述】:

所以我有以下功能:

GraSys::CRectangle GraSys::CPlane::boundingBox(std::string type, std::string color)
{
   CRectangle myObject = CRectangle(color);
   return myObject;
}

既然 boundingBox 是命名空间 GraSys 的一部分,我必须使用它来声明这个函数,为什么我不需要在函数内部这样做?为什么我可以直接使用?为什么它让我编译没有问题?

CRectangle myObject = CRectangle(color);

安装:

GraSys::CRectangle myObject = GraSys::CRectangle(color);

希望我的问题没有混淆。

【问题讨论】:

  • 如果我不得不猜测,那是因为函数定义的范围继承了声明类(以及函数本身)的任何地方的范围,它位于命名空间内。
  • 因为 GraSys 既是一个对象的命名空间,也是一个使用构造函数的对象。它告诉它它是 A GraSys::CRectangle 并为其分配一个 CRectangle(color) 。如果你使用 using namespace GrySys,你将可以在代码中省略它。

标签: c++ function namespaces


【解决方案1】:

您正在实现一个在 GrasSys 命名空间中声明的函数。当您在该函数中时,您使用声明名称空间。

为清楚起见,请考虑:

namespace GraSys {
    class CRectangle { ... };
    class CPlane {
        ... boundingBox(...); ...
    }
    void example(...) { ... };
}

当你实现boundingBox时,你将处于函数声明时声明的命名空间,即GraSys。 CRectangle 是在 GraSys 中声明的,所以你可以直接使用它。同样,注意你也可以直接调用函数,所以在上面的代码中,你可以直接在你的boundingBox实现中调用example。

【讨论】:

    【解决方案2】:

    这称为非限定名称查找。您可以阅读 C++ 标准部分 3.4.1 或更易于阅读的形式 here 中的完整查找规则。

    这是标准中的一个示例,可能比冗长的解释更好:

    namespace A {
        namespace N {
            void f();
        }
    }
    
    void A::N::f() {
        i = 5;
        // The following scopes are searched for a declaration of i:
        // 1) outermost block scope of A::N::f, before the use of i
        // 2) scope of namespace N
        // 3) scope of namespace A
        // 4) global scope, before the definition of A::N::f
    }
    

    【讨论】:

    • 我认为 CPlane 是一个类而不是命名空间,所以我不确定这个答案有多大意义。
    • 是的,CPlane 是同一个命名空间 GraSys 中的一个类,CRectangle 是另一个类。
    【解决方案3】:

    using namespace 就像将命名空间添加到全局命名空间(即 :: 命名空间)。如果你这样做,从现在开始编译器将在所有使用的名称空间中查找每个符号。

    只有在有歧义的情况下(意味着在 2 个已用名称空间中声明的同名符号,您必须为其使用名称空间。

    namespace A{
       void f();
       void g();
    }    
    
    namespace B{
        void g();
    }
    
    using namespace A;
    using namespace B;
    
    A::f(); //always work
    f(); //work since it is the only symbol named f
    
    A::g();//always work
    B::g();//always work
    g();// error since g is ambiguous.
    

    【讨论】:

    • 您确定您回答了正确的问题吗?而不是this one
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2011-03-20
    • 2015-09-15
    相关资源
    最近更新 更多