我正在上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_;
};
我不想让任何人告诉我如何完成整个作业 - 只是想知道如何让它编译?谢谢!完整的main.cpp&amp;下面的IntegerRange.h文件:
//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
答案 0 :(得分:2)
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
的实现(例如,替换实现的前向声明)。
正如你所说,你不能更新IntegerRange
课程,你必须使用这个想法来限定iterator
课程:
class MyOuterClass::MyInnerClass
{
// ...
};
答案 1 :(得分:0)
如果您想转发声明class iterator
,请在class IntegerRange
之外声明。或者你想将它声明为friend
类?例如,
template <typename T>
class IntegerRange
{
public:
friend class iterator;
// ...
};
答案 2 :(得分:0)
提示:(您仍然需要实施++
运营商等。)
#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;
}