c++ - 在模板中实例化模板对象

标签 c++ templates instantiation

我正在上 C++ 类(class),但在完成其中一项家庭作业时遇到了困难。我们得到了以下类(我已将其添加到我的 .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 和 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

最佳答案

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
{
  // ...
};

关于c++ - 在模板中实例化模板对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748802/

相关文章:

templates - Ember model.get() 未正确返回值或绑定(bind)到模板

python - 创建具有未知数量属性的类实例

c++ - std::get 在处理元组 vector 时返回错误

c++ - c++中虚继承是什么

c++ - 代码没有返回正确的索引

c++ - 如何将模板化的结构/类声明为 friend ?

c++ - 使用 libCurl 和 JsonCpp 从 https 网络服务器解析

c++ - 模板类无法正确构建

java - 如何在方法调用中实例化一个新 bean?

java - Gettin 枚举类型可能无法实例化异常