NDK C ++ 11,调用已删除的构造函数错误

时间:2013-11-19 01:37:30

标签: gcc c++11 android-ndk clang

我有一个名为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中编译良好但是我有点迷失。我感谢你们给予的任何帮助!

编辑: 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);

: - /

1 个答案:

答案 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&)’

dequevector替换list并不会显示此行为。

所以,似乎这是从g ++ 4.6到4.7的回归或者是对先前错误的修正。无论如何,我用g ++提交了一份错误报告,请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59192