Pointeur sur methode, template, etc...

[Résolu]
Signaler
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
Bonjour,
Mon probleme est un peu particulier,
je voudrais lancer un Thread sur un methode de classe:

pour se faire j'ai fait une fonction de ce genre:

template <typename k="">
void		thread_callback(std::pair<k, k=""> *pair)
{
K i = pair->first;
K p = pair->second;

i->*p();
}


et je voudrais l'appeler de cette maniere;


std::pair<zsocket zsocket=""> *p =
new std::pair(this->sock, ZSocket::*startSelect);
this->thread = Thread::createThread(thread_callback, p);



Mais ca ne marche pas ...

Meme la paire ne compile pas ...
Si vous aviez des infos, des liens ou meme la solution ca m'aiderait :)

Merci d'avance



Sortie du compilateur (VC9):
:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(36) : error C2059: syntax error : '::*'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(38) : error C2065: 'p' : undeclared identifier
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(39) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : fatal error C1004: unexpected end-of-file found



"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"</zsocket></k,></typename>

4 réponses

Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
probleme resolu:

template <typename K, typename L>
#if WIN32
DWORD WINAPI thread_callback(LPVOID param)
#else
void thread_callback(void *param)
#endif
{
std::pair<K, L> *pair = (std::pair<K, L> *)param;
K i = pair->first;
L p = pair->second;

(i->*p)();
#if WIN32
return (0);
#endif
}

void ZNetwork::startNetworkThread()
{

std::pair<ZSocket *, meth> p(this->sock, &ZSocket::startSelect);
this->thread = Thread::createThread(thread_callback<ZSocket *, meth>, &p);
}
Messages postés
2448
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
17
Je reposte:

Bonjour,
Mon probleme est un peu particulier, je voudrais lancer un Thread sur un methode de classe et pour se faire j'ai fait une fonction de ce genre:

template <typename K>
void thread_callback(std::pair<K, K> *pair)
{
K i = pair->first;
K p = pair->second;

i->*p();
}

et je l'appel comme ca:

void ZNetwork::startNetworkThread()
{
std::pair<ZSocket *, ZSocket::*startSelect> *p =
new std::pair(this->sock, ZSocket::*startSelect);
this->thread = Thread::createThread(thread_callback, p);
}

Ma classe Thread lance CreateThread sous windows et pthread_create sous linux

Mais ca ne marche pas ... Meme la paire ne compile pas ... Si vous aviez des infos, des liens ou meme la solution ca m'aiderait bien :)

voila merci d'avance

Sortie du compilateur (vc9):

c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(36) : error C2059: syntax error : '::*'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(38) : error C2065: 'p' : undeclared identifier
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(39) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : error C2143: syntax error : missing ';' before '}'
c:\documents and settings\daedric\bureau\zap\src\network\znetwork.cpp(42) : fatal error C1004: unexpected end-of-file found
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
124
Ton template me parait bizarre. Tu es sûr de vouloir faire un "template <typename K>" et pas un "template <typename K, typename K2>" ?
La pair ne peut avoir le même type dans ses deux paramètres.

Je te propose un petit exemple, qui répondra peut être à ta question:

#include
#include

#define callMemberFunction(object, ptrToMember)  ((object).*(ptrToMember))

class ZSocket
{
public:
  void startSelect()
  {
    std::cout << "kikoo" << std::endl;
  }
};

typedef void (ZSocket::*func) ();

template <typename Object, typename Method>
void thread_callback(std::pair<Object, Method>* pair)
{
  Object obj = pair->first;
  Method met = pair->second;
  (obj.*met)();
}

// Perso je mettrais plutot une reference:
//
// template <typename Object, typename Method>
// void thread_callback(std::pair<Object, Method>& pair)
// {
//   Object obj = pair.first;
//   Method met = pair.second;
//   (obj.*met)();
// }

int main()
{
  ZSocket sock;
  func pFunc = &ZSocket::startSelect;

  (sock.*pFunc)();
  callMemberFunction(sock, pFunc) ();
  std::pair<ZSocket, func> p(sock, pFunc);

  thread_callback(&p);

  return 0;
}
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
124
Oupss, j'avais pas rafraîchit la page... Problème résolu, c'est l'important :p