将vector转换为带有指向成员指针的map
Convert vector to map with pointers to members?
我很难理解为什么
下面的代码#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_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;
}
我认为错误应该是不同的。
Student::id
不能作为template
参数出现在常量表达式中
相关文章:
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制