Visual Studio 2008 -> 2010 端口:错误 C2039:“select2nd”:不是“std”的成员

Posted

技术标签:

【中文标题】Visual Studio 2008 -> 2010 端口:错误 C2039:“select2nd”:不是“std”的成员【英文标题】:Visual Studio 2008 -> 2010 port: error C2039: 'select2nd' : is not a member of 'std' 【发布时间】:2012-07-17 06:33:50 【问题描述】:

我正在将一个大型 C++ COM 项目从 VS2008 移植到 VS2010。有一行代码如下,在我的VS2008项目中编译正常,但是在VS2010中编译时出现引用错误:

std::select2nd<std::map<DWORD, ISomethingUseful*>::value_type>());

编译错误是:

error C2039: 'select2nd' : is not a member of 'std'

我知道这是一个“非标准”函数,但是编写此代码的人最初是在 VS2008 的 std 命名空间中发现它的,而他们使用的任何 #include 在 VS2010 中似乎不再正确。

有谁知道这个功能现在在 VS2010 中的什么位置?具体来说,现在需要包含哪个头文件才能使用它?


编辑:为了暂时解决这个问题,我从 VS2008 VC\include\functional 头文件中获取了代码,并将其包含在我的代码库中(在实用程序类中),如下面的回答所述。

仍然会感谢其他人能够提供的任何见解!

【问题讨论】:

您确定编写此代码的人找到 std 中的函数,而不是添加 std 中的函数吗? @DigitalDa,这和这个问题有什么关系? 我尝试搜索 VS2010 库,它看起来根本不包含它。这个参考似乎表明它是一个 SGI 非标准函数:sgi.com/tech/stl/select2nd.html。看起来它与“.second”的功能相同,因此您可以尝试或自己编写函数并将其实现为 .second。 从外观上看,它是 stl_function.h 的一部分,它是功能的旧标头。在 SGI 实现中甚至有一条注释: //select1st 和 select2nd 是扩展:它们不是标准的一部分。如果需要,您可以从 www.sgi.com/tech/stl/stl_function.h 获取代码。 现在我已经完成了从 复制 select2nd 函数的 VS2008 实现并将其包含在我的代码库中。我会等着看是否有人提出更好的答案,如果没有,我会在这里发布解决方案,包括要使用的源代码,以供后代使用!感谢您迄今为止的帮助。 【参考方案1】:

好吧,这个问题的答案似乎是 std::select2nd(...) 函数在 VS2008 中通过 functional 库得到支持,但是它已在 VS2010 中被弃用。以下是来自 VS2008 的代码,如果需要,可以在将代码移植到 VS2010 时重新实现此功能:

template<class Pair> struct select2nd : public std::unary_function<Pair, typename Pair::second_type>
   
    // functor for unary second of pair selector operator
    const typename Pair::second_type& operator()(const Pair& Left) const
       
        // apply second selector operator to pair operand
        return (Left.second);
    
;

【讨论】:

以上是关于Visual Studio 2008 -> 2010 端口:错误 C2039:“select2nd”:不是“std”的成员的主要内容,如果未能解决你的问题,请参考以下文章