ошибка: нет соответствия для ‘operator <<' C

#c #templates #iterator #compiler-errors

#c #шаблоны #итератор #ошибки компилятора #c

Вопрос:

Я просмотрел несколько потоков в 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 Tamp; elem) {

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

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

template <typename T>
std::ostreamamp; operator<<(std::ostreamamp; os, const btree<T>amp; tree) {

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

  return os;
}
  

Я вполне осознаю, что моя вставка ничего не возвращает, но я еще не закончил реализацию этой функции, я просто пытаюсь проверить, как извлечь элементы из списка в данный момент. Может кто-нибудь сказать мне, что я делаю не так?

Комментарии:

1. Вы имели в виду os << *itr; вместо этого?

Ответ №1:

Используйте *itr вместо itr :

 os << *itr;
  

Это желаемое поведение.

Теперь, чтобы это сработало, вы должны убедиться, что это operator<< существует для типа T , который в основном является типом *itr .

Вместо ручного цикла вы также могли бы использовать std::copy :

 template <typename T>
std::ostreamamp; operator<<(std::ostreamamp; os, const btree<T>amp; tree) {

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

Комментарии:

1. БОЖЕ><» Я тоже это знал! Недостаток сна действует мне на нервы, ха-ха, спасибо за помощь! очень ценится