如何在 C++ 的头文件中使用命名空间中声明的类型?
How can I use types declared in a namespace inside a header file in C++?
我在 Visual Studio 2017 年使用 C++ 制作了一个 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 文件中使用在它们自己的命名空间中声明的类型?
How can I use types declared in namespaces inside .cpp files?
你使用 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
,在检查您的代码时都必须记住您的别名,与指定全名的相当可识别且明确的第一个选项相反。
but Is adding namespaces in header files a bad and dangerous practice
in C++?
确实如此,请参阅此处的综合说明:Why is “using namespace std” considered bad practice?。
我在 Visual Studio 2017 年使用 C++ 制作了一个 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 文件中使用在它们自己的命名空间中声明的类型?
How can I use types declared in namespaces inside .cpp files?
你使用 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
,在检查您的代码时都必须记住您的别名,与指定全名的相当可识别且明确的第一个选项相反。
but Is adding namespaces in header files a bad and dangerous practice in C++?
确实如此,请参阅此处的综合说明:Why is “using namespace std” considered bad practice?。