ошибка: нет совпадения для 'operator <<' C ++ - PullRequest
2 голосов
/ 19 октября 2011

Я рассмотрел несколько потоков в 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 Ответ

3 голосов
/ 19 октября 2011

Используйте *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;
}
...