it
не является указателем на Student
, поэтому его нельзя использовать с ->*
оператором доступа к элементу`. Я думаю, что вы имели в виду:
result[(*it).*Member] = *it;
Чтобы сформировать указатель на член, вам нужно использовать &
, это не обязательно. Вам также необходимо ввести имена зависимых типов (например, vector<T>::const_iterator
с typename
).
Эта версия компилируется для меня:
#include <string>
#include <vector>
#include <map>
using namespace std;
struct Student { int id; string name; };
template<typename T, typename U, U T::* Member>
map<U, T> group_by(const vector<T> &items)
{
map<U, T> result;
for (typename vector<T>::const_iterator it = items.begin(); it != items.end(); ++it)
result[(*it).*Member] = *it;
return result;
}
int main()
{
vector<Student> items;
group_by<Student, int, &Student::id>(items);
return 0;
}