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