带有 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 中没有合适的默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

指向向量中对象的指针有时指向向量中的不同对象

matlab,我想把struct里面的一些数字提出来,组成一个向量。

在向量上找到第一对元素(int)并获得第二个(struct)

如何根据特定标准在 vector<struct> 中使用 count() 函数

序列化包含指针向量的struct,每个指针包含其他指针

C++ 传递一个向量<vector<STRUCT>> 进行修改