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