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