我有一个名为RenderCommand的类:
class RenderCommand
{
public:
RenderCommandType commandType;
RenderCommand() : commandType(RenderCommandTypeNone) {};
virtual ~RenderCommand() {};
};
然后我有一个这些RenderCommands的队列,它们将unique_ptrs存储到它们中:
typedef std::deque<std::unique_ptr<RenderCommand>> RenderQueue;
最后在一段代码中,我创建了这些RenderQueues的向量,并尝试调整它的大小:
std::vector<RenderQueue> queues;
queues.resize(4);
调整大小的行给了我一些问题。在clang中我收到错误消息:
call to deleted constructor of 'std::unique_ptr<RenderCommand, std::default_delete<RenderCommand> >'
使用GCC 4.8,我只是得到了一堆类似于
的错误required from '_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = std::_Deque_iterator<std::unique_ptr<RenderCommand>, const std::unique_ptr<RenderCommand>&, const std::unique_ptr<RenderCommand>*>; _ForwardIterator = std::_Deque_iterator<std::unique_ptr<RenderCommand>, std::unique_ptr<RenderCommand>&, std::unique_ptr<RenderCommand>*>; _Tp = std::unique_ptr<RenderCommand>]'
这在Visual Studio 2012中编译良好 strong>但是我有点迷失。我感谢你们给予的任何帮助!
编辑: RenderCommandType只是一个枚举:
enum RenderCommandType
{
RenderCommandTypeNone = 0,
RenderCommandTypeBeginRepeat,
RenderCommandTypeEndRepeat,
RenderCommandTypeBeginScene,
RenderCommandTypeEndScene,
//etc
};
EDIT2:好的,这似乎是一个std :: deque问题,将RenderQueue更改为:
typedef std::vector<std::unique_ptr<RenderCommand>> RenderQueue;
的工作原理。同时删除对我自己的类的引用并且只使用int仍然不起作用(除非像上面我用vector替换deque):
std::vector<std::deque<std::unique_ptr<int>>> tempQueue;
tempQueue.resize(4);
: - /
答案 0 :(得分:1)
我将你的例子简化为
#include <deque>
#include <vector>
struct A {
A(const A&) = delete;
};
void f()
{
std::vector<std::deque<A> > q;
q.resize(4);
}
使用g ++ 4.6,这个例子编译得很好。然而,从g ++ 4.7开始,它会输出很多错误消息,最终导致提到的
error: use of deleted function ‘A::A(const A&)’
用deque
或vector
替换list
并不会显示此行为。
所以,似乎这是从g ++ 4.6到4.7的回归或者是对先前错误的修正。无论如何,我用g ++提交了一份错误报告,请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59192