C++ 如何避免在类头中重复写入名称空间\名称::的问题

C++ 如何避免在类头中重复写入名称空间\名称::的问题,c++,class,namespaces,header-files,C++,Class,Namespaces,Header Files,我有一个类,它广泛使用特定命名空间的成员,如下所示: class Entity { using namespace glm; public: Entity(vec3 position, vec3 direction, vec3 upVector, vec3 velocity, float speed = 0.0f); Entity(vec3 position, vec3 direction, vec3 upVector); Entity(vec3 pos

我有一个类,它广泛使用特定命名空间的成员,如下所示:

class Entity {

    using namespace glm;

  public:

    Entity(vec3 position, vec3 direction, vec3 upVector, vec3 velocity, float speed = 0.0f);
    Entity(vec3 position, vec3 direction, vec3 upVector);
    Entity(vec3 position, vec3 direction);
    virtual ~Entity() {}

    vec3 position()   { return this->pos; }
    vec3 direction()  { return this->dir; }
    vec3 upVector()   { return this->upVec; }
    vec3 velocity()   { return this->vel; }
    float speed()     { return this->spd; }

    // lots of other methods

  protected:

    vec3 pos;
    vec3 dir;
    vec3 upVec;
    vec3 vel;
    float spd;

    // lots of other members

};
我刚刚发现类中不允许使用名称空间
,所以我不能这样做。
我只能看到两种选择,这两种选择都很愚蠢:

  • 在每次使用成员(vec3、vec4、mat3等)之前,重复
    名称::
    (glm::)
  • 在类之外声明
    使用名称空间
    ,并将此名称空间强制给所有人,包括我的头

  • 有没有更好/更干净的方法,如何解决这个问题?

    作为一种良好的实践,您自己的类也应该位于名称空间中。你可以把using语句放在那里

    namespace MyProject
    {
        using namespace glm;
    
        class Entity
        {
            ...
        };
    }
    

    如果您要经常使用
    vec3
    ,可以使用
    typedef

    class Entity {
    public:
        typedef glm::vec3 vec3;
    
        Entity(vec3 position, vec3 direction, vec3 upVector, vec3 velocity, float speed = 0.0f);
        // more things...
    };
    
    希望这能有所帮助。

    如果您仔细研究一下,您可能会对解决此问题的方法有所了解。 我相信大多数人都同意在头文件中定义一个无限制作用域名称空间是个坏主意,因为它会影响包含头文件的所有其他文件。 如果语法是允许的,那么将类和名称空间封装在另一个块中似乎是最好的解决方案。因此,名称空间范围将仅限于外部块。 不幸的是,自从我做了严肃的C++工作以来,已经有一段时间了,我记不清编译器在头文件中允许这个语法:

    {
    using namespace glm;
    
    class Entity {
        ...
    }
    
    }
    

    使用typedef?类似于typedef glm::X glmX的东西?在类中使用glm::vec3可以工作为什么1是一个问题?我认为这是最好的实践,也是最具可读性的。我不介意编写名称空间,如果使用它的成员的情况很少,但是当它的成员很多的时候1。过了一段时间,到处写它真的很烦人。2.它看起来很难看,并将代码扩展到屏幕的右侧。3.glm库旨在提供与OpenGL着色语言相同的工具,OpenGL着色语言使用vec3、mat3等工具。。。没有任何前缀。为什么不使用glm::vec3?@zenith:是否可以在类中编写此代码?因为如果不是,您仍然会强制您的includer从名称空间glmYes到这个元素vec3,
    可以在类内部使用
    。如果上面的块也是名称空间,那么是