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