1

我无法理解为什么下面的代码

#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 '`  

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

我该如何解决?

4

2 回答 2

1

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

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

要形成指向成员的指针,您需要使用&,它不是可选的。您还需要引入依赖类型名称(例如vector<T>::const_iteratorwith 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;
}
于 2011-10-04T04:33:50.830 回答
1

我认为错误应该不同

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

于 2011-10-04T04:36:55.013 回答