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

时间:2014-04-11 17:04:00

标签: c++ default-constructor glm-math

在.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:&#39;碰撞&#39; :没有合适的默认构造函数,为什么?

2 个答案:

答案 0 :(得分:1)

您可以阅读here类型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

答案 1 :(得分:0)

以下代码编译得很好,这是其他问题。

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