C++ 向量推回:不';t转换参数

C++ 向量推回:不';t转换参数,c++,C++,我想做的是把一个我称之为Block的类的对象推回到不同的向量上,这些向量保留Block元素,并保存在向量中 std::vector<std::vector<Block>> mapvec; mapvec[xcnt].push_back(new Block(xcnt,ycnt)); std::vector mapvec; mapvec[xcnt]。推回(新块(xcnt,ycnt)); 这是我迄今为止的进步 error C2664: 'std::vector<_Ty&

我想做的是把一个我称之为
Block
的类的对象推回到不同的向量上,这些向量保留
Block
元素,并保存在向量中

std::vector<std::vector<Block>> mapvec;
mapvec[xcnt].push_back(new Block(xcnt,ycnt));
std::vector mapvec;
mapvec[xcnt]。推回(新块(xcnt,ycnt));
这是我迄今为止的进步

error C2664: 'std::vector<_Ty>::push_back': convetion of the parameter 'Block *' in 'const Block &' not possible
错误C2664:'std::vector::push_back':不可能在'const Block&'中转换参数'Block*'
(翻译自德语)


我该怎么办?有没有其他方法可以满足我的要求?不使用数组?

将您的
mapvec定义为

std::vector<std::vector<Block*>> mapvec;
std::vector mapvec;

相反?

将您的
mapvec定义为

std::vector<std::vector<Block*>> mapvec;
new Block(xcnt,ycnt) 
std::vector mapvec;
相反

new Block(xcnt,ycnt) 
提供指向新分配的
块的
。向量期望
Block
而不是
Block*


换成

mapvec[xcnt].push_back(Block(xcnt,ycnt));
这将把
复制到向量中,因此
类应该有一个可访问的复制构造函数

提供指向新分配的
块的
。向量期望
Block
而不是
Block*


换成

mapvec[xcnt].push_back(Block(xcnt,ycnt));

这将把你的
复制到向量中,这样
类应该有一个可访问的复制构造函数。

new
返回一个指向动态分配对象的指针。这不是你想在这里做的。通常,您希望将一个临时(或已存在)对象传递到
push_back
,它将向内存中插入一个副本

因此,只需去掉
new
。像这样:

std::vector<std::vector<Block>> mapvec;
mapvec[xcnt].push_back(Block(xcnt,ycnt));

这样,只要您从向量中删除项或向量被销毁,就可以使用
delete
释放分配给
new
的内存

new
返回指向动态分配对象的指针。这不是你想在这里做的。通常,您希望将一个临时(或已存在)对象传递到
push_back
,它将向内存中插入一个副本

因此,只需去掉
new
。像这样:

std::vector<std::vector<Block>> mapvec;
mapvec[xcnt].push_back(Block(xcnt,ycnt));
这样,只要您从向量中删除项或向量被销毁,就可以使用
delete
释放分配给
new
的内存

你应该:

mapvec[xcnt].push_back(Block(xcnt,ycnt));
因为您持有的是块的实例,而不是它们的指针,所以您应该:

mapvec[xcnt].push_back(Block(xcnt,ycnt));

因为你们持有的是Block的实例,而不是他们的指针

好吧,多亏了你们,这很好!你认为可以在stackoverflow上问一些很容易回答的问题吗^^^一般来说可以,但你会发现类似的问题已经被回答了多次。请使用搜索功能,不要发布其他问题的副本。在向社区寻求帮助之前,展示你自己试图找到答案。哦,如果其中一个答案帮助你解决了问题,请将其标记为答案(不一定是我的答案)。好的,谢谢你们,结果很好!你认为可以在stackoverflow上问一些很容易回答的问题吗^^^一般来说可以,但你会发现类似的问题已经被回答了多次。请使用搜索功能,不要发布其他问题的副本。在向社区寻求帮助之前,只需表明你试图自己找到答案。哦,如果其中一个答案帮助你解决了问题,请将其标记为答案(不一定是我的答案)。@Excelcius考虑到问题的提出方式,这可能不是最安全的解决方案,但它解决了如何修复编译器的问题。我同意你在回答中提供了更好的解决方案。我并不是说你的解决方案是错误的,但对我来说这是一个初学者问题,所以他可能不知道他必须为你的解决方案中的每一项调用delete。@Excelcius考虑到问题是如何提出的,这可能不是最安全的解决方案,但它解决了如何修复编译器的问题。我同意你在回答中提供了更好的解决方案。我并不是说你的解决方案是错误的,但对我来说这是一个初学者的问题,所以他可能不知道他必须为你的解决方案中的每一项调用delete。