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

时间:2018-09-07 17:00:34

标签: c++ header namespaces directx-11

我正在使用C ++在Visual Studio 2017中制作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文件中自己的名称空间中声明的类型?

1 个答案:

答案 0 :(得分:5)

  

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

您使用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;

通过这样的 aliasing ,您可以使用在=前面加上的任何名称,而不是整个DirectX::XMFLOAT3。但是请注意,如果您是在相对全局的上下文中(例如文件或限定名称空间)这样做的,那么熟悉名称空间(例如DirectX)的任何人在遍历代码时都必须记住别名,相对于公认的全名优先选择全名。

  

但是在头文件中添加名称空间是一种不良且危险的做法   在C ++中?

确实,请在此处查看全面的说明:Why is “using namespace std” considered bad practice?