Поскольку компилятор не может неявно преобразовать шаблон в предикат. Вы должны явно указать, какую функцию вызывать:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template <typename T>
void myfunction (T i)
{
cout << " " << i;
}
int main () {
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myfunction<int>);
cout << endl;
}
В качестве альтернативы вы можете написать предикат, подобный этому:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct MyPredicate {
template <typename T>
void operator () (T i)
{
cout << " " << i;
}
};
int main () {
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), MyPredicate ());
cout << endl;
}