Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Можно ли вернуть из шаблонной функции value_type


Автор: disputant 23.2.2012, 22:37
Заинтересовал такой вопрос - пусть есть шаблонная функция вида

template<typename RandomIterator>
void func(RandomIterator i) {...}

В ней легко и просто работать с типом, на который указывает итератор -
typedef typename iterator_traits<RandIter>::value_type Value; и вперед...

А как сделать функцию, которая возвращает значение этого типа? Что-то вроде

template<typename RandomIterator>
iterator_traits<RandIter>::value_type func(RandomIterator i) {...} ? 

Такое в принципе возможно?




Автор: 586 24.2.2012, 00:22
Цитата(disputant @  23.2.2012,  23:37 Найти цитируемый пост)
template<typename RandomIterator>
iterator_traits<RandIter>::value_type func(RandomIterator i) {...} ? 

Такое в принципе возможно?

Да.

template<typename RandomIterator>
typename iterator_traits<RandIter>::value_type func(RandomIterator i) {...}

Автор: disputant 24.2.2012, 05:55
Цитата(586 @ 24.2.2012,  00:22)
Да.

template<typename RandomIterator>
typename iterator_traits<RandIter>::value_type func(RandomIterator i) {...}

Спасибо, и правда работает!  smile 

Никак не могу прочувствовать этот typename - где его надо ставить, где не надо... Прямо как артикли a и the в английском - тоже вечно они у меня не к месту  smile 

Нет какого-то ПРОСТОГО до тупизны правила, чтоб даже до меня дошло? smile



Автор: Result 24.2.2012, 08:12
Цитата(disputant @ 24.2.2012,  05:55)
Нет какого-то ПРОСТОГО до тупизны правила, чтоб даже до меня дошло? smile

Scott Meyers Effective C++ Third Edition, 55 Верных советов улучшить структуру и код ваших программ - правило 42.

Автор: newbee 24.2.2012, 08:29
Когда из(-под) шаблона выводится тип, нужно ставить typename.

Автор: borisbn 24.2.2012, 11:53
Билдерюга этого НЕ требует. Как-то я взял свой проект с билдера (не весь, а несколько исходников) и попытался откомпилировать в студии. Долго тупил, зачем от меня требуют typename...

Автор: volatile 24.2.2012, 23:19
Студия почти русским языком говорит что надо делать:
Код

warning C4346: 'iterator_traits<_Iter>::value_type' : dependent name is not a type 
    prefix with 'typename' to indicate a type


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