Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用.inl内联文件的转发声明不完整_C++_C++11_C++14_Glm Math - Fatal编程技术网

C++ 使用.inl内联文件的转发声明不完整

C++ 使用.inl内联文件的转发声明不完整,c++,c++11,c++14,glm-math,C++,C++11,C++14,Glm Math,我希望标题没有误导 我正在制作自己的线性代数数学库,只是为了练习和更好地理解数学编程。我使用glm数学库作为参考和帮助。我目前的类型是: class Vector2、Vector3、Vector4 所有类都表示浮点向量(后面将是templated) 向量2.h #include <SomeGenericMathFunctions.h> //Forward Declare Vector3 struct Vector3; struct Vector2 { public: fl

我希望标题没有误导

我正在制作自己的线性代数数学库,只是为了练习和更好地理解数学编程。我使用
glm
数学库作为参考和帮助。我目前的类型是:

class Vector2、Vector3、Vector4

所有类都表示浮点向量(后面将是
template
d)

向量2.h

#include <SomeGenericMathFunctions.h>

//Forward Declare Vector3
struct Vector3;

struct Vector2
{
public:
    float X, Y;
    //Constructors

    //Constructor in question
    Vector2(const Vector3 & inVec3);

    //Functions
    //Operators
};
#include <Vector2.inl>
Vector3
是后来定义的。这段代码让我
使用了未定义的类型“Vector3”
。据我所知,
glm
正在做同样的事情,一切看起来都很好(
glm
不包括
vec3
vec2
内的任何地方)。是一个有用的链接,帮助我更好地理解正在发生的事情,它似乎说了同样的事情,单独的声明/定义等

我在glm的包含项和依赖项vec2vec3上使用VS-Code映射进行了扩展搜索,但没有找到任何内容。我错过了什么

编辑:我主要关心的是
glm
是如何做我的代码试图做的事情的。我已经知道“简单/正确”的方法,但我想理解glm的代码


我正在使用
c++11
+

据我搜索和理解
glm
使用前向声明
type_vec.hpp
包含在每个
type_vecX.hpp
文件中,它具有声明和
TYPEDEF
所有向量(
float
-
bool
-
精度)
第103行

技巧是使用
template
s。首先,I
template
d
structs

template<typename T>
struct Vector2
{
public:
...
};
模板
结构向量2
{
公众:
...
};
对于所讨论的构造器,更改是

声明:

template<typename S>
Vector2(const Vector3<S> & inVec3);
模板
向量2(常量向量3和inVec3);
定义

template <typename T>
template <typename S>
inline Vector2<T>::Vector2(const Vector3<S> & inVec3) : 
X(static_cast<T>(inVec3.X)), 
Y(static_cast<T>(inVec3.Y))
{}
模板
模板
内联向量2::向量2(常量向量3和inVec3):
X(静态_-cast(inVec3.X)),
Y(静态铸造(inVec3.Y))
{}

glm不使用转发声明。这是否回答了您的问题@S.M.你能再详细说明一下吗?我无法理解他们如何在
vec2
内部使用
vec3
而不包含或转发声明内容。至于第二条评论,我已经知道怎么做了,这是合乎逻辑的事情,但我试图理解
glm
的方式。我可以编辑我的问题,如果我没有说清楚。请更具体地说,你在哪里发现vec2中使用的vec3。请参考官方代码。我好像明白了。你把模板弄糊涂了。vec2不使用vec3,但vec使用vec
template <typename T>
template <typename S>
inline Vector2<T>::Vector2(const Vector3<S> & inVec3) : 
X(static_cast<T>(inVec3.X)), 
Y(static_cast<T>(inVec3.Y))
{}