нет соответствующей функции для вызова ... ошибка с шаблоном класса - PullRequest
0 голосов
/ 10 мая 2011

Мне нужно сделать общий двойной связанный список, и я сделал это в 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)

Как я могу это исправить?

Ответы [ 2 ]

3 голосов
/ 10 мая 2011
void Erase(iterator const &_first, iterator const &_last){...}

Это позволяет передавать временные итераторы, возвращенные из first() и last().Вы не можете получить неконстантную ссылку на временную.

В качестве альтернативы, вы можете использовать эту сигнатуру функции и работать с копиями итератора (если вам, например, необходимо изменить их в Erase):

void Erase(iterator _first, iterator _last){...}
2 голосов
/ 10 мая 2011

Проблема в том, что неконстантная ссылка не может быть привязана к временной. Результаты first() и last() являются временными, и они не могут быть связаны ссылками в подписи Erase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...