在具有glm向量的结构中没有合适的默认构造函数

No appropriate default constructor available in struct with glm vectors

本文关键字:默认 构造函数 结构 glm 向量      更新时间:2023-10-16

in.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);
};

in.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:"碰撞":没有合适的默认构造函数可用,为什么?

您可以在这里阅读类型T非常适合std::vector的要求
此处未列出默认可构造性。

我还尝试编译这个最小的代码示例,其中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来暗示的。

以下代码编译良好,问题出在其他方面。

#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));
}