Pointeur sur methode, template, etc... [Résolu]

Signaler
Messages postés
2465
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
-
cptpingu
Messages postés
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
-
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
2465
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
11
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
2465
Date d'inscription
samedi 21 février 2004
Statut
Modérateur
Dernière intervention
29 janvier 2010
11
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
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
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
3802
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
9 janvier 2020
93
Oupss, j'avais pas rafraîchit la page... Problème résolu, c'est l'important :p