Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > QMap<QString, T>::const_iterаtor как параметр функ


Автор: Vasya 5.4.2014, 10:10
Привет!

Пытаюсь написать следущее:

Код

template <class T>
bool atEnd(QMap<QString, T> container, QMap<QString, T>::const_iterator it) {
  return it == container.end();
}


Получаю ругательства в в виде:
QMap<QString, T>::const_iterator is not a type. 

Ничего против не имею, но что же делать? Спасибо!

Автор: Vasya 5.4.2014, 10:52
Загуглив, нашел и исправил объявление функции на

Код

bool atEnd(QMap<QString, T> container, class QMap<QString, T>::const_iterator it)


Необходимо использовать ключевые слова class или typename перед QMap<QString, T>::const_iterator. Осталось понять, в какой книге написано про это, чтоб восполнить пробел в знаниях.

Автор: vinter 5.4.2014, 11:09
http://www.e-reading.ws/chapter.php/1002058/106/Mayers_-_Effektivnoe_ispolzovanie_CPP.html, должно быть у Страуструпа тоже

Автор: Lukkoye 5.4.2014, 12:07
Цитата(Vasya @  5.4.2014,  10:10 Найти цитируемый пост)
Ничего против не имею, но что же делать? Спасибо! 


template <class T>
bool atEnd(const QMap<QString, T>& container, typename const QMap<QString, T>::const_iterator& it) {
  return it == container.end();
}


1. 
В выражении в аргументе шаблоне QMap<QString, T>::const_iterator
типом является const_iterator

Однако, компилятор до инстанцирования шаблона не может знать что это такое, поскольку до инстанцирования шаблона, он ничего не знает о T, и теоретически развернуться оно может во что угодно.

Ключевое слово typename перед выражением сообщает компилятору: что бы там ни было, но оно является типом.

Теперь компилятор может корректно определить правильность синтаксиса.


2. Судя по туловищу функции: return it == container.end();
Нет ни одной причины зазря делать копию контейнера передавая его по значению.

Используйте константные ссылки.

Автор: Vasya 5.4.2014, 13:47
Цитата(Lukkoye @  5.4.2014,  12:07 Найти цитируемый пост)
2. Судя по туловищу функции: return it == container.end();
Нет ни одной причины зазря делать копию контейнера передавая его по значению.

Используйте константные ссылки.


 smile Во время выполнения получил интересный результат, потом заметил, что передаю не по ссылке!

Автор: borisbn 7.4.2014, 09:22
А почему бы так не сделать
Код
template < class С >
bool atEnd( const С & container, const typename С::const_iterator & it) {
  return it == container.end();
}

?

Автор: kamre 23.4.2014, 10:19
Цитата(Vasya @  5.4.2014,  10:10 Найти цитируемый пост)
но что же делать?

Вот, даже IDE подсказывает что делать:
user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)