2013-11-19 2 views
0

У меня есть класс с именем RenderCommand:NDK C++ 11, вызов удаленной ошибки конструктора

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); 

Изменение размеров линии давая мне несколько вопросов. В лязгом я получаю сообщение об ошибке:

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 однако, так что я немного потерял. Я ценю любую помощь, которую вы, ребята, можете дать!

EDIT: RenderCommandType это просто перечисление:

enum RenderCommandType 
{ 
    RenderCommandTypeNone = 0, 
    RenderCommandTypeBeginRepeat, 
    RenderCommandTypeEndRepeat, 
    RenderCommandTypeBeginScene, 
    RenderCommandTypeEndScene, 
    //etc 
}; 

EDIT2: Хорошо это кажется станд :: Deque проблема, изменение RenderQueue к:

typedef std::vector<std::unique_ptr<RenderCommand>> RenderQueue; 

работ. Кроме удаления ссылок на мой собственный класс и просто используя ИНТ по-прежнему не работает (если не указано, как выше я заменяю Deque с вектором):

std::vector<std::deque<std::unique_ptr<int>>> tempQueue; 
tempQueue.resize(4); 

: -/

+0

Позвольте мне телепатически догадаться: RenderCommandType удалили, недоступны или неоднозначные конструкторы перемещения или не были тривиально скопируемыми? Добавьте в свой вопрос определение RenderCommandType. –

+0

Извините за путаницу, RenderCommandType - это просто перечисление, добавленное в исходный вопрос. – Rajveer

+0

Возможно, этот ответ помогает http://stackoverflow.com/a/19692951/1741542 –

ответ

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 этот пример компилируется отлично. С г ++ 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

+0

Спасибо за тестирование! Я также отправил отчет об ошибке, но (возможно, неправильно) на Android: https://code.google.com/p/android/issues/detail?id = 62479 – Rajveer

+0

Ну, давайте посмотрим, что они из этого сделают. Они должны либо признать, и исправить, либо объяснить, почему это правильное поведение. –

Смежные вопросы