【问题标题】:Incomplete forward declaration using .inl inline files使用 .inl 内联文件的不完整前向声明
【发布时间】:2020-04-14 00:03:09
【问题描述】:

我希望标题没有误导。

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

class Vector2, Vector3, Vector4

所有类都表示浮点向量(稍后将是templated)。

Vector2.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>

Vector2.inl

//Inline Constructor definitions
.
.
.
//Constructor in question
inline Vector2::Vector2(const Vector3  & inVec3) : X(inVec3.X), Y(inVec3.Y)
{}
//Functions & operators definitions

Vector3 是后来定义的。这段代码给了我use of undefined type 'Vector3'。据我所知,glm 正在做同样的事情,一切看起来都很好(glm 不包括vec3vec2 内的任何地方)。 Here 是一个有用的链接,它帮助我更好地理解正在发生的事情,它看起来像是在说同样的事情,单独的声明/定义等。

我使用 VS Code Maps 对glm 的包含和对vec2vec3 的依赖项进行了扩展搜索,但我找不到任何东西。我错过了什么?

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

我正在使用c++11+

【问题讨论】:

  • glm 不使用前向声明。
  • 这能回答你的问题吗? Use of undefined type
  • @S.M.你能详细说明一下吗?我无法理解他们如何在 vec2 内部使用 vec3 而不包括或转发声明某些内容。至于第二条评论,我已经知道该怎么做,这是合乎逻辑的事情,但我试图理解glm 的方式。如果我说得不够清楚,我可以编辑我的问题。
  • 请更具体一点,您在哪里发现 vec2 中使用的 vec3。请参考官方代码。
  • 我好像明白了。您对模板感到困惑。 vec2 不使用 vec3,但是 vec 使用 vec

标签: c++ c++11 c++14 glm-math


【解决方案1】:

据我搜索并了解glm 使用前向声明。 type_vec.hpp 包含在每个 type_vecX.hpp 文件中,具有声明,typedefs 用于所有向量(float-bool,high-low 精度)line 103

诀窍在于使用templates。首先我templated structs

template<typename T>
struct Vector2
{
public:
...
};

对于有问题的构造函数,变化是

声明:

template<typename S>
Vector2(const Vector3<S> & 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))
{}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2014-02-02
    • 2018-03-18
    相关资源
    最近更新 更多