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

Edu*_*ona -3 c++ namespaces header directx-11

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

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

“C4430: missing type specifier - int assumed”
Run Code Online (Sandbox Code Playgroud)

在我声明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();

    };

}
Run Code Online (Sandbox Code Playgroud)

如果我添加这个:

using namespace DirectX;
Run Code Online (Sandbox Code Playgroud)

我摆脱了这个问题.我的问题是using namespaces X在头文件中是否是C++中一个糟糕而危险的做法?还有我如何在.cpp文件中使用在自己的命名空间中声明的类型?

Rei*_*ica 5

如何在.cpp文件中使用名称空间中声明的类型?

在您的情况下,您使用范围解析运算符,如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

每次你引用该命名空间中的名称时都是如此.

第二个选项,如果您真的希望避免在头文件中按照每种用法键入命名空间,请使用以下using语法:

using XMFLOAT3 = DirectX::XMFLOAT3;
Run Code Online (Sandbox Code Playgroud)

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

但是在头文件中添加名称空间在C++中是一个坏的和危险的做法吗?

确实,请参阅此处的全面解释:为什么"使用命名空间std"被认为是不好的做法?.