如何使用std :: ref?

时间:2012-03-06 10:59:55

标签: c++ stl c++11

使用std::ref的正确方法是什么?我尝试在VS2010中使用代码并且无法编译:

#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
struct IsEven
{
    bool operator()(int n) 
    {
        if(n % 2 == 0)
        {
            evens.push_back(n);
            return false;
        }

        return true;
    }

    vector<int> evens;
};
int main(int argc, char **argv)
{
    vector<int> v;
    for(int i = 0; i < 10; ++i)
    {
        v.push_back(i);
    }

    IsEven f;
    vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), std::ref(f));
    return 0;
}

错误:

  

c:\ program files(x86)\ microsoft visual studio   10.0 \ vc \ include \ xxresult(28):错误C2903:'结果':符号既不是类模板也不是函数模板

     

c:\ program files(x86)\ microsoft visual studio   10.0 \ vc \ include \ xxresult(28):错误C2143:语法错误:缺少';'在'&lt;'

之前

还有一些......

2 个答案:

答案 0 :(得分:8)

{C} 10.0的std::ref实现中存在一个错误或一组错误。

据报道已修复Visual C ++ 11;见我的earlier question about it

微软的STL如此回答:“我们已经修复了它,修复程序将在VC11 RTM中提供。(但是,修复程序没有进入VC11测试版。)”

答案 1 :(得分:4)

我收到了与VS2010相同的编译错误,并通过继承std::unary_function进行了更正:

struct IsEven : std::unary_function<int, bool>

由于result出现在错误消息中,我只考虑了这一点。我只能猜测在VS2010中,std::ref取决于typedef中的unary_function

template <class Arg, class Result>
  struct unary_function {
    typedef Arg argument_type;
    typedef Result result_type;
  };

编辑:

请参阅Cheers and hth. - Alf关于VS2010中的错误的答案。