为什么我不需要使用命名空间?

时间:2014-12-11 23:22:12

标签: c++ function namespaces

所以我有以下功能:

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);

希望我的问题不会混淆。

3 个答案:

答案 0 :(得分:2)

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

为清楚起见,请考虑:

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

实现boundingBox时,您将处于函数声明期间声明的名称空间,即GraSys。 CRectangle在GraSys中声明,因此您可以直接使用它。同样,请注意您也可以直接调用函数,因此在上面的代码中,您可以直接在boundingBox实现中调用example。

答案 1 :(得分:1)

这称为非限定名称查找。您可以阅读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
}

答案 2 :(得分:0)

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

仅在存在歧义的情况下(意味着在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.