Шаблонная функция с итераторами - PullRequest
2 голосов
/ 14 декабря 2011

Я пытался сделать Ex.10-02 в Accelerated C ++, и это давало мне ошибки, и я в конечном итоге продолжал «упрощать» свою программу, пока не достиг этой точки, и даже все равно она не скомпилировалась (через g ++), выдавая мне ошибку:

test.cpp: In function ‘int main()’:
test.cpp:22: error: no matching function for call to ‘dumb(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >)’

Вот моя программа:

#include <algorithm>
#include <iostream>
#include <vector>

using std::cout;    using std::endl;
using std::vector;

template <class Ran, class T> T dumb(Ran begin, Ran end)
{
    return *begin;
}

int main()
{
    vector<int> myVector;
    for (int i = 1; i <= 9; ++i)
        myVector.push_back(i);

    int d = dumb(myVector.begin(), myVector.end());
    cout << "Value = " << d << endl;
    return 0;
}

Что вызывает эту ошибку?

Ответы [ 2 ]

5 голосов
/ 14 декабря 2011

Компилятор не может определить тип возврата здесь. На самом деле нет необходимости делать тип возврата параметром шаблона здесь:

template <class Ran> typename Ran::value_type dumb(Ran begin, Ran end)
{
    return *begin;
}
1 голос
/ 14 декабря 2011

Проблема заключается в прототипе вашей функции:

template <class Ran, class T> T dumb(Ran begin, Ran end)

При использовании template s, тип возврата, который является зависимым типом (здесь T), не может быть выведен неявно .

Таким образом, ваша измененная функция должна выглядеть следующим образом:

template <class T, class Ran>
          // ^^^^^ 'T' is coming before 'Ran'
T dumb(Ran begin, Ran end)
{
  return *begin;
}

и она должна называться

int d = dumb<int>(myVector.begin(), myVector.end());
             ^^^^

Итак, мы сделали 2 изменения:

  1. Тип, который должен быть явно упомянут (т. Е. T=int), поступает 1-м
  2. Вызывая dumb<> с явным упоминанием int, так что возвращаемый типявляется вычитаемым

[Примечание. Это решение очень универсально для вашего понимания.Как упоминалось в ответе @ Bjorn, для vector<> тип может быть выведен автоматически с помощью ::value_type.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...