gpt4 book ai didi

c++ - 在 vc2010 中为映射值类型创建指向成员的指针

转载 作者:可可西里 更新时间:2023-11-01 17:51:44 25 4
gpt4 key购买 nike

我们在将代码移植到 VC++ 的旧版本 2010 时遇到了问题。

问题是由 VC 中的 map 实现引起的,它导致 non-type-argument 中的 pointer-to-member 派生到基本转换被要求:

#include <map>
#include <algorithm>

template <typename MapValueType, int MapValueType::*var>
bool f (MapValueType const & v);

int main ()
{
typedef std :: map<int, int> MapType;
MapType m;
std :: find_if (m.begin ()
, m.end ()
, f<MapType::value_type, & MapType::value_type::second> );
}

生成以下消息:

Standard conversion from pointer-to-member of base to pointer-to-member of derived is not applied for template arguments file.cc(x) : error C2973: 'f' : invalid template argument 'int std::_Pair_base<_Ty1,_Ty2>::* '

所以看起来 std::mapvalue_type 的实现在基类中有对。

关于如何解决这个pointer-to-member保持为non-type-argument有什么想法吗?

我们唯一的选择是改变结构,使 f 成为一个 functor 和一个成员 pointer-to-member 吗?

最佳答案

为什么你坚持将指向成员的指针保留为非类型模板参数/参数?

无论如何,我认为你可以使用它,如果你可以限制在 Visual Studio 2010 或带有 decltype()

的编译器
template <typename Class, typename Type>
Class
get_class_type (Type Class:: *);
//...
it = std::find_if(m.begin(), m.end(),
f<decltype(get_class_type(&MapType::value_type::second)), &MapType::value_type::second>);

关于c++ - 在 vc2010 中为映射值类型创建指向成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com