Esta es una pregunta de seguimiento al my previous question.Expresiones de enlace anidado
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 3;};
int something(int a) {return a;};
};
template <class C> auto func(C&& c) -> decltype(c()) { return c(); }
template <class C> int doit(C&& c) { return c();}
template <class C> void func_wrapper(C&& c) { func(std::bind(doit<C>, std::forward<C>(c))); }
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
func_wrapper(foo); // error
// call with a member function
bar b;
func(b);
func_wrapper(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
func_wrapper(std::bind(&bar::something, b, 42)); // error
// call with a lambda expression
func([](void)->int {return 42;});
func_wrapper([](void)->int {return 42;});
return 0;
}
estoy recibiendo un error de compilación de profundidad en las cabeceras de C++:
functional:1137: error: invalid initialization of reference of type ‘int (&)()’ from expression of type ‘int (*)()’
functional:1137: error: conversion from ‘int’ to non-scalar type ‘std::_Bind<std::_Mem_fn<int (bar::*)(int)>(bar, int)>’ requested
func_wrapper (foo) se supone que debe ejecutar func (doit (foo)) En el código real, empaqueta la función para que se ejecute un hilo. func sería la función ejecutada por el otro subproceso, doit se encuentra en el medio para comprobar excepciones no controladas y para limpiar. Pero el enlace adicional en func_wrapper ensucia las cosas ...
tal vez eliminar C++ tag?esto es directo C++ 0x – Anycorn
Mantener ambas etiquetas. C++ 0x es C++ también. – jalf
Dele a PC-Lint un giro (desde www.gimpel.com). Es bastante bueno para dar mensajes de error mucho mejores y detallados que Visual Studio. Sin embargo, es bastante caro. –