如何在 C++ 的头文件中使用命名空间中声明的类型?

How can I use types declared in a namespace inside a header file in C++?

我在 Visual Studio 2017 年使用 C++ 制作了一个 DirectX11 应用程序,我需要在我的 "GeometryGenerator.h" 头文件中声明一个数据结构。

问题是,当我尝试在我的头文件中使用类型:XMFLOAT3 时,当我尝试 运行 项目时,我从 Visual Studio 收到一个错误,并给我这条消息:

“C4430: missing type specifier - int assumed”

在我声明 XMFLOAT3 类型变量的行中

这是我的代码:

#pragma once
#include "..\Common\DeviceResources.h"
#include "ShaderStructures.h"
#include "..\Common\StepTimer.h"

namespace DirectX11Engine
{

    class GeometryGenerator {
    public: 
        struct Vertex
        {
            Vertex() {}
            Vertex(const XMFLOAT3& p, const XMFLOAT3& n, const XMFLOAT3& t, const XMFLOAT2& uv)
                : Position(p), Normal(n), TangentU(t), TexC(uv) {}
            Vertex(
                float px, float py, float pz,
                float nx, float ny, float nz,
                float tx, float ty, float tz,
                float u, float v)
                : Position(px, py, pz), Normal(nx, ny, nz),
                TangentU(tx, ty, tz), TexC(u, v) {}

            XMFLOAT3 Position;
            XMFLOAT3 Normal;
            XMFLOAT3 TangentU;
            XMFLOAT2 TexC;
        };
        void PruebaDeTipos();

    };

}

如果我添加这个:

using namespace DirectX;

我解决了这个问题。我的问题是头文件中的 using namespaces X 在 C++ 中是否是一种糟糕且危险的做法?以及如何在 .cpp 文件中使用在它们自己的命名空间中声明的类型?

How can I use types declared in namespaces inside .cpp files?

你使用 scope resolution operator,在你的情况下是这样的:

Vertex(const DirectX::XMFLOAT3& p, const DirectX::XMFLOAT3& n, const DirectX::XMFLOAT3& t, const DirectX::XMFLOAT2& uv)

...

DirectX::XMFLOAT3 Position;
DirectX::XMFLOAT3 Normal;
DirectX::XMFLOAT3 TangentU;
DirectX::XMFLOAT2 TexC;

每次您引用该命名空间中的名称时,依此类推。

如果您确实希望避免在头文件中每次使用时键入命名空间,则第二种选择是使用以下 using 语法:

using XMFLOAT3 = DirectX::XMFLOAT3;

通过像这样别名,您可以使用您在= 之前放置的任何名称,而不是整个DirectX::XMFLOAT3。但是请注意,如果您在相对全局的上下文(例如文件或命名空间命名空间)中这样做,那么熟悉命名空间的任何人,例如 DirectX,在检查您的代码时都必须记住您的别名,与指定全名的相当可识别且明确的第一个选项相反。

but Is adding namespaces in header files a bad and dangerous practice in C++?

确实如此,请参阅此处的综合说明:Why is “using namespace std” considered bad practice?