Преобразовать вектор в карту с указателями на членов? - PullRequest
1 голос
/ 04 октября 2011

У меня проблемы с пониманием, почему код ниже

#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 (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); //Error
    return 0;
}

выдает эту ошибку:

*error C2440*: 'specialization' : cannot convert from `''` to `'int Student::* const '`  

Контекст не позволяет устранять неоднозначность перегруженной функции

Как мне это исправить?

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Я думаю, что ошибка должна отличаться .

Student::id не может отображаться в константном выражении как параметр template.

1 голос
/ 04 октября 2011

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...