在模板中实例化模板对象
Instantiating Template Object within a template
我正在上一门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;
// ...
};
相关文章:
- 对象实例化调用构造函数的次数太多
- 为什么C++无法识别我的对象实例化?
- 使用大括号和 : 符号的对象实例化
- 对象实例化与类型C++
- cpp 静态对象实例化
- 用户创建的类对象实例化的未申请标识符
- 对象实例化后不输出
- 限制对象实例化堆
- 未知的 C++ 对象实例化语法
- 由于命名空间而导致的对象实例化错误
- C 在对象实例化时如何分开声明和构造函数
- JNI Java对象实例化期间的Segfault
- C++ 类文件中的对象实例化
- C++ 中的对象实例化
- 无法理解浮点数和对象实例化之间比较的原因
- C++对象实例化与赋值
- C++:用友元类限制对象实例化
- 将类中的对象实例化数限制为给定数量
- 使用 Sizeof、malloc 和 cast 的 C++ 对象实例化
- 通用成员函数定义,可从 'const' 和 'non-const' 对象实例化