为什么我不能将const_ptr用于const迭代器?

时间:2013-12-22 01:36:22

标签: c++ templates iterator const shared-ptr

我正在制作一种基于链表的时髦数据结构,其中每个元素都与一个唯一的堆分配的内部迭代器关联,后者指向它(外部迭代器分别指向这些迭代器)。我们的想法是让迭代器在删除元素时不会失效,而是发现自己指向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无效

有人可以解释这个错误吗?

2 个答案:

答案 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;
//                    ^^^^^^^^