【问题标题】:error: no match for 'operator<<' C++错误:'operator<<' C++ 不匹配
【发布时间】:2011-12-10 18:34:23
【问题描述】:

在我想问这个问题之前,我已经查看了 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;
}

我很清楚我的插入没有返回任何内容,但是我还没有完成该功能的实现,我现在只是在尝试测试如何将元素从列表中取出。谁能告诉我我做错了什么?

【问题讨论】:

  • 你的意思是os &lt;&lt; *itr;吗?

标签: c++ templates iterator compiler-errors


【解决方案1】:

使用*itr 代替itr

os << *itr;

这是期望的行为。

现在,要使其工作,您必须确保 operator&lt;&lt; 存在于类型 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;
}

【讨论】:

  • OMG >
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 2011-10-06
  • 2011-12-08
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多