Параметры шаблона begin
и end
установлены неправильно.Они передаются s
, то есть Slice<int>
, поэтому T
выводится на Slice<int>
.Тип возвращаемого значения vector<Slice<int> >::const_iterator
.Но Slice<int>::Begin
возвращает vector<int>::const_iterator
.
Как вы упомянули в своем комментарии, решение состоит в том, чтобы изменить параметр с const T&
на const Slice<T>&
.Таким образом, T
выводится в int
вместо Slice<int>
, и тип возвращаемого значения становится vector<int>::const_iterator
, как вы хотите.
template<typename T>
typename std::vector<T>::const_iterator
begin(const Slice<T>& s) {
return s.Begin();
}
Однако, если вы измените имя своих функций на begin
вместо Begin
, вы можете использовать std::begin
, который имеет более общее поведение:
template<typename T>
auto begin(const T& t)
-> decltype(t.begin()) {
return t.begin();
}
Оператор for, основанный на диапазоне, имеет специальное правило, гарантирующее, что std::begin
будетнайден путем поиска, зависящего от аргумента, даже если ваш тип не является частью пространства имен std.Меньше работы с вашей стороны.