C++ 嵌套模板类语法

标签 c++ linked-list iterator

我有一个类List这是一个固定大小的链表,在该类中还有另一个类 ListIterator指向 List 的一个特定元素.我的问题是 c++我不熟悉的语法和来自 gcc 的构建错误对我没有帮助。

template<class T, int length>
class List {
public:
    //some stuff here
    //Row-struct

    template<class T>
    class ListIterator {
        public:
            ListIterator(int mPos, Row& mRow){pos = mPos; row = mRow;};
            T& operator *();
        private:
            int pos;
            Row& row;
    };

    typedef ListIterator<T> iterator;

    iterator begin();
private:
    int startIdx;
    Row storage[length];
};

template<class T, int length>
ListIterator List<T, length>::begin() {
    ListIterator *itor = new ListIterator(startIdx, storage[startIdx]);
    return itor;
}

我收到以下错误:

error: shadows template parm 'class T'

  1. 我该怎么做typedef ListIterator<T>工作?
  2. 如何使用相同的 T我用于 List对于迭代器?
  3. 为什么我的 begin()不工作?

最佳答案

ListIterator 模板参数 T 重命名为其他名称,例如 TInner。或者,如果它可以使用外部类的 T,则将其设为常规类。或者将 ListIterator 移到 List 类之外,这将是一个更好的主意,因为 ListIterator 实际上并不执行任何特定于列表的操作。

要修复 begin 函数,您需要使用正确的类型:

template<typename T, int length> typename List<T, length>::iterator
List<T, length>::begin(void)
{
    iterator item_iterator(startIdx, storage[startIdx]);
    return(item_iterator);
}

关于C++ 嵌套模板类语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47200710/

相关文章:

c - 如何在不跨节点的情况下在graphviz中绘制链表?

c++ - std::vector 迭代器不兼容

c++ - ‘virtual const char* ro_err::StdErr::what() const’ 的宽松 throw 说明符

C++ 使用 Poco 库编译错误 - 包含空格的路径名

c++ - 由于未对齐的内存地址,内存地址是否会被破坏?

c - 取消引用指向不完整类型链表的指针 - C

c++ - 创建显示功能

C++获取单链表中匹配节点的前一个节点

Java Apache POI——创建一个迭代器来查找日期

python修改可变迭代器