在我想到问这个问题之前,我已经查看了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;
}
我很清楚我的插入没有返回任何内容,但我还没有完成该函数的实现,我只是想测试如何从列表中取出元素。有人能告诉我我做错了吗?
答案 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;
}