【问题标题】:No appropriate default constructor available in struct with glm vectors带有 glm 向量的 struct 中没有合适的默认构造函数
【发布时间】: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 吗?

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


【解决方案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));
}

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2015-07-07
    • 2017-08-15
    相关资源
    最近更新 更多