【问题标题】:C++ nested template classes syntaxC++ 嵌套模板类语法
【发布时间】:2018-04-22 09:07:09
【问题描述】:

我有一个类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;
}

我收到以下错误:

错误:阴影模板参数 'class T'

  1. 如何使typedef ListIterator&lt;T&gt; 工作?
  2. 如何将与 List 相同的 T 用于迭代器?
  3. 为什么我的begin() 不起作用?

【问题讨论】:

  • 你什么都不用做,用就行,在这个范围内是已知的。
  • 但我想在ListIteratorList 中使用ìterator 作为typedef
  • class ListIterator inside template &lt;typename T&gt; class List 可以访问T,它不需要是模板。您甚至可以直接将其命名为 class iterator 并跳过 typedef

标签: c++ linked-list iterator


【解决方案1】:

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);
}

【讨论】:

  • ListIterator 必须知道一些关于List 的事情(指针、下一个元素、上一个元素等)
  • @binaryBigInt 您的代码并没有演示它。
  • 另一个选项是尾随返回类型
  • @VTT 如何访问我的main.cpp 中的对象? List&lt;int,2&gt; list; List::iterator *it = list.begin(); 不起作用。
  • @binaryBigInt begin 应该返回迭代器,而不是指向迭代器的指针。你需要使用正确的类型名称(再次),它应该是List&lt;int, 2&gt;::iterator it = list.begin();
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2011-05-04
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 2018-02-06
相关资源
最近更新 更多