将vector转换为带有指向成员指针的map

Convert vector to map with pointers to members?

本文关键字:成员 指针 map vector 转换      更新时间:2023-10-16

我很难理解为什么

下面的代码
#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 '`  

上下文不允许消除重载函数

的歧义

如何解决这个问题?

it不是指向Student的指针,因此您不能将其与->*成员访问操作符一起使用。我想你的意思是:

result[(*it).*Member] = *it;

要形成指向成员的指针,需要使用&,它不是可选的。您还需要引入依赖类型名称(例如vector<T>::const_iteratortypename)。

这个版本为我编译:

#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;
}

我认为错误应该是不同的。

Student::id不能作为template参数出现在常量表达式中