2011-10-19 2 views
1

J'ai regardé quelques threads sur stackoverflow avant de penser à poser cette question (car il y en a eu quelques-uns), mais même en implémentant certaines des solutions , ça ne semble pas aider mon problème. Ça ou je le fais mal.erreur: aucune correspondance pour 'operator <<' C++

Quoi qu'il en soit, comme il va, l'erreur que je reçois est:

error: no match for 'operator<<' in 'os << itr' 

ma classe est:

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; 
} 

Je suis tout à fait conscient que mon insert ne retourne rien, mais je havre de paix Je n'ai pas fini d'implémenter cette fonction, j'essaie juste de tester comment retirer les éléments de la liste pour le moment. Quelqu'un peut-il me dire ce que je fais mal?

+2

Vouliez-vous dire 'os << * ITR,' la place? – Flexo

Répondre

2

Utilisation *itr au lieu de itr:

os << *itr; 

Ceci est le comportement souhaité.

Maintenant, pour que cela fonctionne, vous devez vous assurer qu'il existe operator<< pour le type T qui est fondamentalement le type de *itr.

Au lieu de boucle manuelle, vous pouvez utiliser std::copy ainsi:

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; 
} 
+2

OMG><"Je le savais aussi! Le manque de sommeil m'arrive haha, merci pour l'aide! – SNpn

Questions connexes