2011-05-10 138 views
0

我必須做一個通用的雙鏈表,和我在vC++ 2010做到了,一切運作良好,但我已經用gcc來編譯它,但它無法編譯它。當我打電話,其具有一個迭代作爲參數的方法,我得到這個錯誤:用於調用...錯誤與模板類沒有匹配功能

no matching function for call to 'DLList<int>::Erase(DLList<int>::iterator, DLList<int>::iterator)'| 
[...]note: candidates are: void DLList<T>::Erase(DLList<T>::iterator&, DLList<T>::iterator&) [with T = int]| 

的DLLIST是在.h文件中,和內聯定義的每個方法。迭代器類也在DLList類中。

template<typename T> 
class DLList{ 
[...] 
public: 
[...] 
    void Erase(iterator &_first, iterator &_last){...} 
    iterator first(){...} 
    iterator last(){...} 
[...] 
    class iterator{...} 
[...] 
}; 

而且這將導致錯誤的代碼:

iList.Erase(iList.first(), iList.last()); 

(ILIST:DLLIST < int>的ILIST)

我怎樣才能解決這個問題?

回答

3
void Erase(iterator const &_first, iterator const &_last){...} 

這允許臨時迭代器,從first()last()返回傳遞。您無法獲得臨時的非常量引用。

或者,您可以使用此功能的簽名和迭代器拷貝工作(比如,如果你需要內Erase修改它們):

void Erase(iterator _first, iterator _last){...} 
+0

這工作得很好。我沒有修改擦除函數的簽名,而是在列表(it1和it2)之後聲明瞭2個迭代器,然後iList.Erase(it1 = iList.first(),it2 = iList.last());很好。 – gberes 2011-05-10 22:02:55

2

問題是一個非const引用不能綁定到臨時。 first()last()的結果是臨時的,並且那些不能被Erase的簽名中的參考所限制。

相關問題