带有 glm 向量的 struct 中没有合适的默认构造函数

Posted

技术标签:

【中文标题】带有 glm 向量的 struct 中没有合适的默认构造函数【英文标题】:No appropriate default constructor available in struct with glm vectors 【发布时间】:2014-04-11 17:03:59 【问题描述】:

在.h中:

enum collisionType AB, BA, AoverB, AunderB;

struct Collision 
public:
    collisionType type;
    glm::vec2 point1;
    glm::vec2 point2;

    Collision(enum collisionType, glm::vec2, glm::vec2);
;

在 .cpp 中:

Collision::Collision(enum collisionType collisType, glm::vec2 p1, glm::vec2 p2) : type(collisType), point1(p1), point2(p2)



使用它

std::vector<Collision> collisions;

glm::vec2 point1(11.0, 12.0);
glm::vec2 point2(12.0, 13.0);

collisions.push_back(Collision(AoverB, point1, point2));

出现错误 C2512: 'Collision' : 没有合适的默认构造函数可用,为什么?

【问题讨论】:

上面的 sn-p 在 g++ 上编译得很好。你确定你不在某处使用Collision a; 或smth 吗? 【参考方案1】:

您可以阅读 here 类型 T 以非常适合 std::vector 的要求。 Default-constructible 未在此处列出。

我还尝试编译这个最小的代码示例,其中 X 没有默认构造函数,并且可以使用 MSVC 正常编译:

#include <vector>

struct X 
    X(int a, int b) : A(a), B(b) 
    int A;
    int B;
;

int main() 
    std::vector<X> v;
    v.push_back(X(10,20));

所以,问题一定出在代码的其他地方。

无论如何,您可能希望添加一个不带参数的构造函数,以使您的 Collission 类“默认可构造”,并使编译器满意:

struct Collision 

    // Default constructor.
    // Initialize data members to some init values.
    Collision() 
        ...
    

PS 请注意,C++ 中的struct 等价于class public: ...,因此您可以在代码中省略public: 行:使用关键字struct 暗示了这一行。

【讨论】:

它没有说明默认构造。从 c++11 开始,只有 CopyAssignable 和 CopyConstructible,或 MoveAssignable 和 MoveConstructible。 @BlazBrazanic:谢谢,我已经更新了我的答案。我还测试了 std::vector 和 push_back 似乎可以与不可默认构造的类一起正常工作。 OP 的问题肯定出在其他地方。【参考方案2】:

以下代码编译正常,问题出在其他地方。

#include <glm/vec2.hpp>
#include <vector>

enum collisionType AB, BA, AoverB, AunderB;

struct Collision 
public:
    collisionType type;
    glm::vec2 point1;
    glm::vec2 point2;

    Collision(enum collisionType, glm::vec2, glm::vec2);
;

Collision::Collision(enum collisionType collisType, glm::vec2 p1, glm::vec2 p2) : type(collisType), point1(p1), point2(p2)




int main()

    std::vector<Collision> collisions;

    glm::vec2 point1(11.0, 12.0);
    glm::vec2 point2(12.0, 13.0);

    collisions.push_back(Collision(AoverB, point1, point2));

【讨论】:

以上是关于带有 glm 向量的 struct 中没有合适的默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

glm::translate - 它是不是从向量构建矩阵?

GLM的向量矩阵乘法行为?

Unity中如何获取指定角度的方向向量

如何理解 glm::distance 和 glm::length 背后的向量数学?

glm::dot 返回一个向量

复制构造函数没有合适的默认构造函数