【问题标题】:Why can't I have a shared_ptr to a const iterator? [duplicate]为什么我不能将 shared_ptr 用于 const 迭代器? [复制]
【发布时间】:2014-01-10 14:19:46
【问题描述】:

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

谁能解释这个错误?

【问题讨论】:

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


    【解决方案1】:

    该类型有一个依赖名称(因为它依赖于T),这需要明确的名称消歧:

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

    【讨论】:

      【解决方案2】:

      您需要一个typename 关键字:const typename std::list&lt;pointer_node&lt;T&gt;&gt;::iterator

      如果没有关键字,编译器首先假定iterator 是一个对象,而不是一个类型,并且它会混淆,也许是在将const 应用于它时。不过,错误消息可能会更清楚。

      【讨论】:

        猜你喜欢
        • 2012-03-26
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多