所以我有以下功能:
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);
希望我的问题不会混淆。
答案 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.