есть код:
typedef unsigned (__stdcall* Func)(void*);
void foo(Func f)
{ }
template<class T, unsigned (T::*p)() >
unsigned __stdcall wrp(void*)
{
return 0;
}
struct test
{
test(){ doit(); }
unsigned f() {return 0;}
void doit()
{
foo(wrp<test,&test::f>); //***C2664
}
};
test t;
MSVC 6.0 на отмеченной строке выдает C2664: cannot convert parameter 1 from 'unsigned int (void *)' to 'unsigned int (__stdcall *)(void *)'
MSVC 2005 компилирует. Очередной баг шестерки, можно как-то пофиксить?
Здравствуйте, Sashaka, Вы писали:
S>MSVC 6.0 на отмеченной строке выдает C2664: cannot convert parameter 1 from 'unsigned int (void *)' to 'unsigned int (__stdcall *)(void *)'
S>MSVC 2005 компилирует. Очередной баг шестерки, можно как-то пофиксить?
typedef unsigned (__stdcall* Func)(void*);
void foo(Func f)
{ }
template<class T, unsigned (T::*p)() >
unsigned /*__stdcall*/ wrp(void*)
{
return 0;
}
struct test
{
test(){ doit(); }
unsigned f() {return 0;}
static unsigned __stdcall thunk(void* p)
{
return wrp<test,&test::f>(p);
}
void doit()
{
foo(&test::thunk);
}
};
test t;
Тока такой переходник надо писать для каждого аргумента шаблона. Может быть можно ещё что-то навернуть, что бы не надо было.
Здравствуйте, remark, Вы писали:
R>Тока такой переходник надо писать для каждого аргумента шаблона. Может быть можно ещё что-то навернуть, что бы не надо было.
гребаная шестерка, даже так нельзя (иногда помогало в других случаях нае.. обмануть компилятор):
typedef unsigned (__stdcall* Func)(void*);
void foo(Func f)
{ }
template<class T, unsigned (T::*)() >
class sux
{
public:
sux()
{ }
static unsigned __stdcall go( void* p )
{ return 0; }
};
class c
{
public:
c()
{
sux<c,&c::test>::go(0); //C2973: 'sux' : invalid template argument '__formal'
}
unsigned test()
{ return 0; }
};
c cc;
а 2005 опять компилит.... блин как убедить руководство перейти на 2003 или 2005 студию? =(