How to use std::ref?
Asked Answered
R

2

11

What is the correct way to use std::ref? I tried following code in VS2010 and it doesn't compile:

#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;
}

Errors:

c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxresult(28): error C2903: 'result' : symbol is neither a class template nor a function template

c:\program files (x86)\microsoft visual studio 10.0\vc\include\xxresult(28): error C2143: syntax error : missing ';' before '<'

Plus some more...

Resht answered 6/3, 2012 at 10:59 Comment(2)
It compiles with g++ (both 4.6 and 4.8).Madera
@nabulke: even in C++11? I thought this should work..Resht
W
9

There is a bug or set of bugs in Visual C++ 10.0 implementation of std::ref.

It has reportedly been fixed for Visual C++ 11; see my earlier question about it.

STL at Microsoft answered thusly: "We've already fixed it, and the fix will be available in VC11 RTM. (However, the fix didn't get into the VC11 Beta.)"

Wenger answered 6/3, 2012 at 11:17 Comment(0)
T
4

I recieved the same compilation error with VS2010 and corrected it by inheriting from std::unary_function:

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

I only considered this due to result appearing in the error message. I can only guess that std::ref, in VS2010, depends on the typedefs in unary_function:

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

EDIT:

See answer from Cheers and hth. - Alf regarding bug in VS2010.

Telson answered 6/3, 2012 at 11:13 Comment(1)
This should not be necessary anymore. File a bug.Whilst

© 2022 - 2024 — McMap. All rights reserved.