2012-03-06 12 views
9

¿Cuál es la forma correcta de usar std::ref? He intentado siguiente código en VS2010 y no compila:Cómo usar std :: ref?

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

Errores:

c: \ archivos de programa de Visual Studio (x86) \ Microsoft 10,0 \ VC \ include \ xxresult (28): error C2903: 'resultado': el símbolo no es una plantilla de clase ni una plantilla de función

c: \ archivos de programa (x86) \ microsoft visual studio 10.0 \ vc \ include \ xxresult (28): error C2143: error de sintaxis: falta ';' antes '<'

Plus un poco más ...

+0

compila con g ++ (ambos 4.6 y 4.8). – kennytm

+0

@nabulke: incluso en C++ 11? Pensé que esto debería funcionar ... – Asha

Respuesta

8

Hay un error o conjunto de errores en la implementación de Visual C++ 10.0 de std::ref.

Se ha informado que se ha corregido para Visual C++ 11; ver mi earlier question about it.

STL en Microsoft respondió así: "Ya hemos fijado, y la solución estará disponible en VC11 RTM (Sin embargo, la solución no llegó a la Beta VC11.)."

4

he recibido el mismo error de compilación con VS2010 y lo corrigió heredando de std::unary_function:

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

sólo consideraba esto debido a result que aparece en el mensaje de error. Sólo puedo imaginar que std::ref, en VS2010, depende de las typedef s en unary_function:

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

EDIT:

Véase la respuesta de Cheers and hth. - Alf respecto error en VS2010.

+0

Esto ya no debería ser necesario. Archivo un error. – pmr

+0

Compila con esta vez ... interesante ... – Asha

Cuestiones relacionadas