1

I'm having trouble understanding why the code below

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

gives this error:

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

Context does not allow for disambiguation of overloaded function

How do I fix this?

4

2 に答える 2

1

itへのポインターではないため、メンバー アクセス演算子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

I think the error should be different.

Student::id cannot appear in a constant expression as a template parameter.

于 2011-10-04T04:36:55.013 に答える