错误:不匹配'operator<<' C ++

时间:2011-10-19 09:25:44

标签: c++ templates iterator compiler-errors

在我想到问这个问题之前,我已经查看了stackoverflow上的一些线程(因为那里有一些问题),但即使通过实现一些解决方案,它似乎也没有帮助我解决问题。那或我做错了。

无论如何,正如它所说的那样,我得到的错误是:

 error: no match for 'operator<<' in 'os << itr'

我的课程是:

template <typename T> 
class btree {

  public:
    btree(size_t maxNodeElems);
    ~btree() {}

    struct node {   // <- this is just a declaration of a private inner-class
      list <T> elements;
      node *lvl;
    };

  private:
    size_t maxNodeElems;
    node*  root;   // <- this is the actual private member

};

template <typename T>
btree<T>::btree(size_t maxNodeElems) {
  if (maxNodeElems > 0) maxNodeElems = maxNodeElems;
  root = new node;
  root->lvl = new node[maxNodeElems+1];
}

template <typename T>
pair <typename btree<T>::iterator, bool> btree <T>::insert (const T& elem) {

  root->elements.push_back(elem);
  root->elements.sort();

  std::pair <typename btree<T>::iterator, bool> e;
  return e;
}

template <typename T>
std::ostream& operator<<(std::ostream& os, const btree<T>& tree) {

  class list <T>::iterator itr = tree.root->elements.begin();
  for (; itr != tree.root->elements.end(); ++itr) os << itr; 

  return os;
}

我很清楚我的插入没有返回任何内容,但我还没有完成该函数的实现,我只是想测试如何从列表中取出元素。有人能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:3)

使用*itr代替itr

os << *itr;

这是理想的行为。

现在,为了实现这一点,您必须确保类型operator<<存在T,这基本上是*itr的类型。

您可以使用std::copy代替手动循环:

template <typename T>
std::ostream& operator<<(std::ostream& os, const btree<T>& tree) {

 std::copy(tree.root->elements.begin(),
           tree.root->elements.end(),
           std::ostream_iterator<T>(os, " "));//print " " between 2 elements
  return os;
}