2011-10-19 70 views
1

在我想問這個問題之前,我已經查看了一些關於stackoverflow的線程(因爲這裏有一對夫婦),但即使通過實現一些解決方案,它似乎沒有幫助我的問題。這或我做錯了。錯誤:'運算符<<'不匹配C++

不管怎麼說,因爲它去,我得到的錯誤是:

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

我很清楚,我插不返回任何內容,但我避風港沒有完成實現該功能,我只是試圖測試如何從目前的列表中獲取元素。有人能告訴我我做錯了什麼嗎?

+2

您的意思是'OS << * ITR;'呢? – Flexo

回答

2

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

OMG><「我也知道這個!缺乏睡眠讓我感到哈哈,感謝您的幫助!非常感謝 – SNpn