2012-04-10 10 views
14

Uso la versión beta de Visual Studio 11 y tengo curiosidad acerca de un error de compilación. Estoy almacenando un objeto std :: function en mi clase.¿C++ 11 std :: function limita el número de argumentos que puede tener un puntero a la función?

typedef std::function<void (int, const char*, int, int, const char*)> MyCallback; 

En mi clase tengo,

MyCallback m_callback; 

Esto compila bien. Si agrego un argumento más a la lista, falla.

typedef std::function<void (int, const char*, int, int, const char*, int)> MyCallback; 

El fracaso es:

>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(535): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>   f:\development\projects\applications\my.h(72) : see reference to class template instantiation 'std::function<_Fty>' being compiled 
1>   with 
1>   [ 
1>    _Fty=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(536): error C2504: 'type' : base class undefined 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2027: use of undefined type 'std::_Get_function_impl<_Tx>' 
1>   with 
1>   [ 
1>    _Tx=void (int,const char *,int,int,const char *,int) 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C2146: syntax error : missing ';' before identifier '_Mybase' 
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional(539): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

Esta es una biblioteca enlazada dinámicamente que se prepara datos para pasar a otra aplicación. Ciertamente, puedo volver a trabajar el formato de los datos para que se pueda aprobar con menos argumentos, pero me preguntaba por qué veo este límite.

conmutación de nuevo al puntero de función de c-estilo,

typedef void (*MyCallback)(int, const char*, int, int, const char*, int); 

parece funcionar bien.

Respuesta

37

Este límite está establecido por la implementación en Visual Studio.

La especificación C++ para std::function no impone ningún límite. std::function usa plantillas variadic para trabajar con cualquier número de argumentos. Las implementaciones pueden tener un límite basado en, por ejemplo, límites de anidamiento de instanciación de plantilla, pero debe ser grande. La especificación sugiere 1024 como una buena profundidad mínima de anidamiento compatible, y 256 como un buen mínimo para los argumentos permitidos en una llamada de función, por ejemplo.

Visual Studio (a partir de VS11) no tiene plantillas variadic. Simulan hasta 5 argumentos en VS11, aunque puede cambiarlo a hasta 10. Haga esto definiendo _VARIADIC_MAX en su proyecto. Esto puede aumentar los tiempos de compilación en gran medida.

Actualización: VS 2012 Nov CTP agrega soporte para plantillas variadic, pero la biblioteca estándar aún no se ha actualizado para usarlas. Una vez que esté actualizado, debe poder usar tantos argumentos como desee con std::function.

+1

Respuesta correcta. También vea [Magic && Secrets] (http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets) por el propio STL en GoingNative 2012, lo menciona una o dos veces. – Xeo

+0

Algo interesante. Recuerdo implementar plantillas variadic siendo solo un pequeño esfuerzo en el lado g ++ de las cosas. –

+0

Excelente, eso responde mi pregunta, ¡Gracias! – BZor

Cuestiones relacionadas