2011-10-04 103 views
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 '` 

語境下不允許重載函數

我該如何解決這個問題的歧義?

回答

1

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; 
} 
+0

這不是錯誤的地方,雖然... – Mehrdad

+0

好的,我得到許多其他的錯誤。更新。 –

+0

哦,只是'&'丟失。哇。非常感謝! :) – Mehrdad