buenas:
es por la convencion de llamadas.
Te explico, en C++ hay diferentes convenciones de llamada a la funcion que son stdcall y thiscall
la primera es la que se usa en las funciones normales y en los metodos estaticos (que funcionan igual).
la segunda es la que se usa en todos los demas métodos de una clase.
Al definir como una funcion (void output1(int a)) en Visual Studio el compilador automaticamente la define como stdcall (estandard).
Realmente es como si hubieras escrito "void __stdcall output1(int a)"
Las funciones standard envian sus parametros a la pila en orden.
Pero si la defines como un metodo de clase, se define como thiscall. Los metodos al fin y al cabo son como funciones, la diferencia es que al llamarlos, el compilador automaticamente añade un parametro "extra" que es necesario en la programacion orientada a objetos.
La diferencia de estas convenciones de llamada es que las cdecl introducen el parametro "this" en el registro ECX, para tener visibilidad de los miembros y metodos de la clase. Como el parametro adicional no se puede introducir sin un objeto que lo contextualize (ej: cuando haces miObj->UsarMetodo(parametro) ), no se puede usar el metodo directamente como un puntero. Este es un problema tipico de intentar usar un metodo como puntero o como thread.
La solucion?
a)podrias definir el metodo como estatico y usar singleton (o no usarlo si no necesitas acceso al objeto).
b)podrias definirlo como una funcion standard y pasar el this como parametro, en este caso quizas te convenga hacerla friend.
c) podrias usar functors (wikipedia)
suerte!
PD: editado para explicarlo un poco mejor.
PD: reañado , despues de documentarme mejor un segmento de codeproject
__cdecl is the default calling convention for C and C++ programs. The advantage of this calling convetion is that it allows functions with a variable number of arguments to be used. The disadvantage is that it creates larger executables.
__stdcall is used to call Win32 API functions. It does not allow functions to have a variable number of arguments.
__fastcall attempts to put arguments in registers, rather than on the stack, thus making function calls faster.
Thiscall calling convention is the default calling convention used by C++ member functions that do not use variable arguments.