void doSomething(std::vector<int>& stopsVec)
{
std::pair<int, int> out;
Calc<std::vector<int>::iterator, std::pair<int, int> >
(stopsVec.begin(), stopsVec.end(), out); // not &out
}
Calc
принимает ссылку на std::pair<int, int>
, поэтому вы хотите просто указать out
. Передача &out
пытается передать указатель на пару - что не сработает.
EDIT
при условии, что подпись действительно:
template<class It>
void Calc(It begin, It end, std::pair<int, int> &out)
Вы можете позвонить с помощью:
Calc(stopsVec.begin(), stopsVec.end(), out);
Компилятор может определить правильный тип шаблона из параметров, не требуя указывать их между <>
EDIT
Кит делает хорошую точку ниже. Это еще одна ошибка компиляции, которую вы могли бы получить здесь. Также обратите внимание, что:
sum += iter;
не делает то, что вы хотите. Вы, вероятно, имели в виду:
sum += *iter;
Но поскольку sum
является целым числом, а iter
является типом шаблона, на самом деле это не шаблонный метод общего назначения. Это действительно будет работать только для итераторов над числовыми типами.
И еще одна проблема:
Calc<std::vector<int>::iterator, std::pair<int, int> > // use a space
(stopsVec.begin(), stopsVec.end(), out);
вместо
Calc<std::vector<int>::iterator, std::pair<int, int>> // ">>" is shift operator
(stopsVec.begin(), stopsVec.end(), out);
Вам нужен пробел между закрывающими >
знаками, чтобы иметь синтаксис шаблона. В противном случае вы выполняете битовое смещение (или извлечение потока), и компилятор запутается, потому что с этого момента ничего не будет иметь смысла.