lundi 25 avril 2016

Lambda Syntax Incompatibility between MSVC and GCC

I have created a method with the following signature in a C++ header:

template<class _Ty>
class x {
public:

    // ...

    template<class func_Ty>
    x *where(func_Ty &);
}

My code expects func_Ty to be callable (i.e. function pointer, lambda, or class that overloads operator()), takes a single parameter of type _Ty or _Ty &, and returns a bool or bool &. I call the function with this code (s is x<int> *):

s->where([](int i){ return i % 2 == 0;});

This compiles fine on MSVC, but GCC gives me an error:

no matching function for call to ‘x<int>::where(main()::__lambda0)’

If i add a * in front of the lambda, GCC compiles fine, but MSVC gives me an error:

error C2100: illegal indirection

Is this a bug in one of the compilers? Or maybe both of these solutions are non-standard? Either way, is there some way to make the same code work on both compilers?

Aucun commentaire:

Enregistrer un commentaire