Я создаю структуру данных на основе 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 недействителен
Может кто-нибудь объяснить эту ошибку?
Вам нужно typename
ключевое слово typename
: const typename std::list<pointer_node<T>>::iterator
.
Без ключевого слова компилятор сначала предполагает, что iterator
является объектом, а не типом, и он запутывается, возможно, когда к нему применяется const
. Однако сообщение об ошибке может быть более четким.
Тип имеет зависимое имя (поскольку оно зависит от T
), которое требует явного значения значений:
std::shared_ptr<const typename std::list<pointer_node<T>>::iterator> p_iter;
// ^^^^^^^^