Я хочу, чтобы конструктор принимал любой итератор, имеющий черту x
и ссылающийся на класс y
.
Class(std::iterator<std::random_access_iterator_tag, MyClass*> it);
Но когда я пытаюсь передать такой итератор, компиляция завершается с ошибкой Candidate constructor not viable: no known conversion from 'iterator' (aka '__deque_iterator<value_type, pointer, reference, __map_pointer, difference_type, __block_size>') to 'std::iterator<std::random_access_iterator_tag, MyClass *>'
.
Код вставки:
std::deque<MyClass*> collection_with_random_access_iterator{};
Class tmp(collection_with_random_access_iterator.begin());
Что я могу здесь сделать?
deque<T>::iterator
не наследуется отiterator<random_access_iterator_tag, T>
(Стандарт не требует этого). (Кстати,MyClass**
также является своего рода итератором произвольного доступа кMyClass*
(и, например,vector<MyClass*>::iterator
может быть именно таким), но необработанные указатели не могут быть получены ни из чего.) - person gx_   schedule 07.09.2013std::iterator
, даже публичное, является лишь деталью реализации. - person gx_   schedule 07.09.2013iterators
стандартных коллекций производились от общего родителя. - person Appleshell   schedule 07.09.2013vector<T>::iterator
иbasic_string<T>::iterator
могут бытьT *
. В любом случае наследование не имеет значения; вы не хотели бы использовать виртуальную функцию для разыменования итератора. - person Potatoswatter   schedule 08.09.2013