2015-09-19 4 views
0
#include <iterator> 
#include <forward_list> 
#include <string> 
#include <vector> 

using namespace std; 

template<typename C> 
using Iterator_type = typename C::iterator; 

template<typename Iter> 
using Iterator_category = typename iterator_traits<Iter>::iterator_category; 

template<typename Ran> 
void sort_helper(Ran beg, Ran end, random_access_iterator_tag){ 
    sort(beg,end); 
} 

template<typename For> 
void sort_helper(For beg, For end, forward_iterator_tag){ 
    vector<decltype(*beg)> vc{beg, end}; 
    sort(vc.begin(),vc.end()); 
    copy(vc.begin(),vc.end(),beg); 
} 

template<typename C> 
void sort(C& c){ 
    using Iter = Iterator_type<C>; 
    sort_helper(c.begin(),c.end(),Iterator_category<Iter>{}); 
} 

void test(vector<string>& vs, forward_list<double>& lls){ 
    sort(vs); 
    sort(lls); 
} 

Я получаю ошибку компиляции - формовка указатель на ссылку типа двойной &возникают ошибки при отправке тегов

Код с Бьярне Страуструп - язык программирования C++ 5.4.2.1 iterator_traits

+1

[MCVE] чувак, погрешности дословно! –

+0

Вы проверили ошибки? http://www.stroustrup.com/4th.html –

ответ

1

В следующем заявлении:

vector<decltype(*beg)> vc{beg, end}; 

decltype спецификатора обеспечивает опорный тип (либо потому, что разыменовывает указатель, которое приводит к Левому и сам по себе является выражением, или, потому что operator* от For class- type объявляет ссылочный тип как возвращаемый тип), который не может быть сохранен в векторе. Вместо этого вы должны использовать std::iterator_traits еще раз, чтобы получить базовый тип.

vector<typename iterator_traits<For>::value_type> vc{beg, end}; 
2

С Бьярне-х errata list for the book:

пг 125: с/decltype (* бек)/value_type < Для >/Услуги ремонта использование decltype займет больше места, чем здесь.

vector<decltype(*beg)> пытается создать vector<double&>, что невозможно.

Смежные вопросы