calling convention и шаблонная функция
От: Sashaka Россия  
Дата: 05.09.07 17:07
Оценка:
есть код:


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 компилирует. Очередной баг шестерки, можно как-то пофиксить?
Re: calling convention и шаблонная функция
От: remark Россия http://www.1024cores.net/
Дата: 05.09.07 17:51
Оценка:
Здравствуйте, 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;



Тока такой переходник надо писать для каждого аргумента шаблона. Может быть можно ещё что-то навернуть, что бы не надо было.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: calling convention и шаблонная функция
От: Sashaka Россия  
Дата: 05.09.07 20:29
Оценка:
Здравствуйте, 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 студию? =(
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.