2013-12-23 4 views
0

Я пытался сделать это:Thrust zip_iterator - является типичным?

thrust::zip_iterator<IteratorTuple> zip; 
zip = make_zip_iterator(...) 

Это не удалось собрать, но когда я сделал это:

typedef thrust::zip_iterator<IteratorTupe> ZipIterator; 
ZipIterator zip = make_zip_iterator(...) 

, мой код компилируется и сделал именно то, что я хотел. Мой вопрос: зачем нужен typedef? И является ли это использование typedef специфичным для этого контекста? Я могу опубликовать остальную часть моего кода, если кто-то подумает, что проблема могла быть в другом месте.

+1

Typedef - это не единственная разница в ваших примерах. Что делать, если вы не используете typedef, но все же инициализируете 'zip' вместо того, чтобы назначать его позже? Как в 'thrust :: zip_iterator zip = make_zip_iterator (...)'? –

+0

Антон, который работает. Я предполагаю, что с 'thrust :: zip_iterator zip' существует двусмысленность объявления и создания экземпляра? Как это разрешено? –

+2

Нет двусмысленности, но, возможно, 'zip_iterator' не имеет конструктора по умолчанию? Это объясняет проблему. У меня нет опыта работы с библиотекой, которую вы используете, но не указывает ли смысл 'zip_iterator' * нигде * семантически? Если это не так, неудивительно, что они не предоставляют конструктор по умолчанию для него. Затем вы всегда должны инициализировать zip_iterators, а не назначать их позже. –

ответ

1

Причина этого:

thrust::zip_iterator<IteratorTuple> zip; 
zip = make_zip_iterator(...) 

терпит неудачу потому, что thrust::zip_iterator не имеет конструктор по умолчанию. Это разумный выбор дизайна, потому что неинициализированный фантастический итератор не имеет практического применения. Версия, включающая в себя команду typedef, работает, потому что конструктор копирования используется во время создания импринтера итератора. Он не является собственностью самого typedef.

[Этот ответ был собран из комментариев и добавлен в качестве вики-записи сообщества, чтобы получить этот вопрос из оставшейся без ответа очереди].

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