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

问题描述 投票:-3回答:1

我正在使用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文件中使用在自己的命名空间中声明的类型?

c++ header namespaces directx-11
1个回答
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;

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

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

确实,请看这里的全面解释:Why is “using namespace std” considered bad practice?

© www.soinside.com 2019 - 2024. All rights reserved.