没有用于调用的匹配函数..模板类错误

no matching function for call to... error with template class

本文关键字:函数 错误 用于 调用      更新时间:2023-10-16

我必须做一个通用的双链表,我在 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 iList)

我该如何解决它?

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

这允许传递从 first()last() 返回的临时迭代器。您无法获取对临时的非常量引用。

或者,您可以使用此函数签名并处理迭代器副本(例如,如果您需要在Erase中修改它们):

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

问题是非常量引用不能绑定到临时引用。first()last()的结果是暂时的,不能受Erase签名中的引用的约束。