我必须做一个通用的双链表,我在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&lt; int&gt; iList)
我该如何解决?
答案 0 :(得分:3)
void Erase(iterator const &_first, iterator const &_last){...}
这允许传递从first()
和last()
返回的临时迭代器。你不能得到一个临时的非const引用。
或者,您可以使用此函数签名并处理迭代器副本(如果您需要在Erase
内修改它们):
void Erase(iterator _first, iterator _last){...}
答案 1 :(得分:2)
问题是非const引用不能绑定到临时引用。 first()
和last()
的结果是临时的,而Erase
的签名中的引用无法约束这些结果。