Szablon funkcji referencja

0

Witam, jest to mój pierwszy post.

Mam pewien problem. Bawiąc się w pisanie algorytmów z stl, trafiłem na pewien nie zrozumiały dla mnie problem. Dlaczego kod poniżej jest poprawny

template <typename InputIterator,typename T,typename BinaryPred>
InputIterator search_n(InputIterator beg,InputIterator end,int Size,T elem,BinaryPred op)
{
     int licznik = 0;
     InputIterator tmp;
     while(beg != end)
     {
          if(op(*beg,elem))
          {
               if(licznik == 0) tmp = beg;
               ++licznik;
          }
          else licznik = 0;

          if(licznik == Size) return tmp;
          ++beg;
     }
     return end;
}

a gdy daję referencję do parametru typu T już nie. Kompilator wywala błąd że nie ma konwersji int do int&

template <typename InputIterator,typename T,typename BinaryPred>
InputIterator search_n(InputIterator beg,InputIterator end,int Size,T& elem,BinaryPred op)
{
     int licznik = 0;
     InputIterator tmp;
     while(beg != end)
     {
          if(op(*beg,elem))
          {
               if(licznik == 0) tmp = beg;
               ++licznik;
          }
          else licznik = 0;

          if(licznik == Size) return tmp;
          ++beg;
     }
     return end;
}

Użycie funkcji w mainie:

     vector<int>::iterator pos2 = search_n(v.begin(),v.end(),2,11,greater<int>());
     if(pos2 != v.end())
     {
          cout << "Kolejne 2 wartosci wieksze od 11 zaczynaja sie od " << distance(v.begin(),pos2) +1 << " pozycji" << endl;
     }
     else
     {
          cout << "Nie ma takich elementow" << endl;
     }

Bardzo proszę kogoś ogarniętego o wyjaśnienie tego

0

Dodaj const:

template <...> InputIterator search_n(..., const T& elem, BinaryPred op) { ... }
0

no tak, rzeczywiście, dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1