Почему я не могу иметь shared_ptr для константного итератора? [Дубликат]

0

Я создаю структуру данных на основе funky связанных списков, где каждый элемент связан с уникальным внутренним итератором, выделенным кучей, который указывает на него (и внешние итераторы указывают на их соответственно). Идея состоит в том, чтобы иметь итераторы, которые не являются недействительными, когда их элемент удаляется, а вместо этого обнаруживают, что они указывают на l.end()

В любом случае, я получаю много ошибок, которые я не понимаю. Здесь класс, который не будет компилироваться, но я не понимаю, почему.

template<class T>
class pointer_node {
public:
    pointer_node(const T& t) :
            t(t), p_iter() {
    }
    pointer_node(T&& t) :
            t(move(t)), p_iter() {
    }
private:
    T t;
    std::shared_ptr<const std::list<pointer_node<T>>::iterator> p_iter;
};

Ошибка, которую я получаю:

../src/pointer_list.h:28:24: ошибка: ISO C++ запрещает объявление типа имени без типа [-fpermissive]../src/pointer_list.h:28:60: error: аргумент шаблона 1 недействителен

Может кто-нибудь объяснить эту ошибку?

Теги:
templates
iterator
const
shared-ptr

2 ответа

2

Вам нужно typename ключевое слово typename: const typename std::list<pointer_node<T>>::iterator.

Без ключевого слова компилятор сначала предполагает, что iterator является объектом, а не типом, и он запутывается, возможно, когда к нему применяется const. Однако сообщение об ошибке может быть более четким.

2

Тип имеет зависимое имя (поскольку оно зависит от T), которое требует явного значения значений:

std::shared_ptr<const typename std::list<pointer_node<T>>::iterator> p_iter;
//                    ^^^^^^^^

Ещё вопросы

Сообщество Overcoder
Наверх
Меню