2013-02-25 2 views
-1

У меня есть эта функция:шаблона аргумент-редукции для возвращения типа

std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> > 
split( const std::vector<int>& vector,size_t slices){ 

... 

} 

и так `ы довольно громоздким, и я, вероятно, нужно будет разделить другие виды векторов в будущем, я хочу сделать он на основе шаблонов, но это проба не удалась:

template<typename T> 
    std::vector<std::pair< std::vector<T>::iterator, std::vector<T>::iterator> > 
    split(const std::vector<T>& vector, size_t slices) 

    ... 

} 

Есть две проблемы, что я вижу: 1 - я не могу использовать вектор или карту или список, только вектор. 2 - Я не очень хорошо разбираюсь в материалах для сокращения шаблонов.

любое объяснение оценен.

+1

И почему этот пробой не удалось? Вы всегда должны публиковать сообщение об ошибке. (Я думаю, вам может не хватать два 'typename's '). – Zeta

+0

Вы должны, вероятно, либо взять ссылку на константу, либо использовать 'const_iterator' в вашем типе результата. – Fozi

+0

Zeta, проблема была в названии типа, но не только в качестве имени, так как я пропускал вектор , а не только T (как вектор beign T.). Fozi, спасибо, обновлено в моем коде. :) –

ответ

1

1 - я не могу использовать вектор или карту или список, [...]

Если вы хотите обрабатывать обобщенно все контейнеры, то вы не должны использовать std::vector шаблон в первом место (и вы не должны назвать свою функцию аргумент vector либо):

template<typename C> 
std::vector<std::pair<typename C::iterator, typename C::iterator>> 
split(C const& cont, size_t slices) 
{ 
    ... 
} 

Также обратите внимание на использование typename ключевого слова, которое необходимо при указании каче ified, зависимое имя типа.

+0

Я использовал std :: container, поэтому я, по крайней мере, мог использовать один контейнер, так как я не знал, как заставить его использовать все (я пытаюсь использовать векторный тип как аргумент шаблона, но не вектор as тип.), спасибо, ваш ответ - это то, что я искал. : D –

+0

@TomazCanabrava: Хорошо, рад, что это помогло :-) –

1
template<typename T> 
    std::vector<std::pair< typename T::iterator, typename T::iterator> > 
    split(const T& vector, size_t slices) 

    ... 

} 

У вас не хватает typename, и вы можете заменить тип контейнера.

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