我正在制作一种基于链表的时髦数据结构,其中每个元素都与一个唯一的堆分配的内部迭代器关联,后者指向它(外部迭代器分别指向这些迭代器)。我们的想法是让迭代器在删除元素时不会失效,而是发现自己指向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 ++禁止声明'type name'没有类型[-fpermissive] ../src/pointer_list.h:28:60:错误:模板参数1无效
有人可以解释这个错误吗?
答案 0 :(得分:2)
您需要typename
个关键字:const typename std::list<pointer_node<T>>::iterator
。
如果没有关键字,编译器首先会假定iterator
是一个对象,而不是一个类型,并且可能会在应用const
时感到困惑。但错误信息可能更清晰。
答案 1 :(得分:2)
该类型具有依赖名称(因为它取决于T
),需要明确的名称消歧:
std::shared_ptr<const typename std::list<pointer_node<T>>::iterator> p_iter;
// ^^^^^^^^