在模板中实例化模板对象

Instantiating Template Object within a template

本文关键字:对象 实例化      更新时间:2023-10-16

我正在上一门c++课,有一项作业我搞不懂。我们得到了下面的类(我已经将其添加到我的。h文件中,并且被告知不要修改),并被告知要实现迭代器类。

template <typename T>
class IntegerRange
{
public:
  class iterator;
  IntegerRange(T low, T high) : low_(low), high_(high)
  {
    assert(low <= high);
  }
  const iterator begin() const {return iterator(low_); }
  const iterator end() const {return iterator(high_); }
private:
      const T low_, high_;
};

我们得到了以下使用它的方法:

IntegerRange<int> r1(-2, 3);
copy(r1.begin(), r1.end(), ostream_iterator<int>(cout, " "));  //-2 -1 0 1 2
IntegerRange<unsigned> r2(0, 6);
copy(r2.begin(), r2.end(), ostream_iterator<unsigned>(cout, " ")); //0 1 2 3 4 5

对于初学者来说,我只是想让代码编译,这样我就可以摆弄它并弄清楚它,但即使这样我也很难做到。我将以下代码添加到相同的.h文件,但我得到错误"未定义成员'IntegerRange::iterator'的隐式实例化"

template <typename T>
class iterator
{
public:
  iterator(T data) : data_(data) {}
private:
  T data_;
};

我不希望有人告诉我如何完成整个作业-只是想知道我如何才能让它编译?谢谢!全mainp &

//main.cpp
#include <iostream>
#include "IntegerRange.h"
#include <algorithm>
 using std::copy;
 using std::cout;
 using std::ostream_iterator;
 int main()
{
  IntegerRange<int> r1(-2, 3);
  copy(r1.begin(), r1.end(), ostream_iterator<int>(cout, " "));  //-2 -1 0 1 2
  IntegerRange<unsigned> r2(0, 6);
  copy(r2.begin(), r2.end(), ostream_iterator<unsigned>(cout, " ")); //0 1 2 3 4 5
  return 0;
}
//IntegerRange
#ifndef Homework7_IntegerRange_h
#define Homework7_IntegerRange_h
#include <cassert>
template <typename T>
class iterator
{
public:
  iterator(T data) : data_(data) {}
private:
  T data_;
};

template <typename T>
class IntegerRange
{
public:
  class iterator;
  IntegerRange(T low, T high) : low_(low), high_(high)
  {
    assert(low <= high);
  }
  const iterator begin() const {return iterator(low_); }
  const iterator end() const {return iterator(high_); }
private:
  const T low_, high_;
};
#endif

IntegerRange定义了一个内部类iterator

template <typename T>
class IntegerRange
{
public:
  class iterator; // forward declaration
  ...

我认为,问题是你没有实现IntegerRange的内部类,而是一个独立的类:

template <typename T>
class iterator
{
public:
  iterator(T data) : data_(data) {}
  ...

编译器认为它是一个完全不相关的类。尝试将iterator的实现移动到IntegerRange类中(例如,用实现替换forward声明)。

正如你所说的,你不能更新IntegerRange类,你必须使用这个想法来限定iterator类:

class MyOuterClass::MyInnerClass
{
  // ...
};

提示:(您仍然需要实现++操作符等)

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
template <typename T>
class IntegerRange
{
public:
    class iterator
    {
    public:
        iterator(T data) : data_(data) {}
        const T& operator*(){return data_;};
    private:
        T data_;
    };
    IntegerRange(T low, T high) : low_(low), high_(high)
    {
        assert(low <= high);
    }
    const iterator begin() const {return iterator(low_); }
    const iterator end() const {return iterator(high_); }
private:
    const T low_, high_;
};

int main()
{
    IntegerRange<int> r1(-2, 3);
    auto it=r1.begin();
    cout << *it << endl;
}

如果您想要转发声明class iterator,请声明它在class IntegerRange之外。或者您想将其声明为friend类吗?例如,

template <typename T>
class IntegerRange
{
public:
  friend class iterator;
  // ...
};