Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Q: pbm c++ pour dev avertis.

8 réponses
Avatar
david
J'ai un probleme de compilation sous Borland Builder 3 avec ceci :
(il est a noter que je tiens a garder une ecriture C++ universelle)
Le message du compilateur: "Cannot convert'char &(*(__closure)())()' to
'char &(*)()'."


voici un extrait de l'entete VP.h :

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
class VirtualProcessor
{
public :

VirtualProcessor();
~VirtualProcessor();

char &(OnByteProcess)(void);

// [...]

}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


et un extrait du fichier source VP.cpp :
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
char & VirtualProcessor::_ByteProcessDefaultEvent(void)
{
// [...]
}

VirtualProcessor::VirtualProcessor()
{
// [...]

OnByteProcess = &_ByteProcessDefaultEvent;

// L'ERREUR DU COMPILATEUR EST MENTIONEE A LA LIGNE CI-DESSUS
// "Cannot convert'char &(*(__closure)())()' to 'char &(*)()'."

// [...]
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


PS:
"__closure" est un mot clef rajoute au C++ par Borland.Il n'est supporte
que par les compilateur de cette marque. Il est necessaire pour rendre
en charge la VCL et est utilise lors de la declaration de gestionnaires
d'evenement.
Il se trouve que j'utilise effectivement la VCL dans ce programme, mais
pas dans cette unite que je destine a etre portee sous divers
environnements (UNIX, DOS, WIN).

MERCI d'avance pour l'aide que vous pourrez m'apporter.

8 réponses

Avatar
Patrick
En C++ standard, la déclaration du pointeur devrait être:

char &(VirtualProcessor::*OnByteProcess)(void);

Et pour lui assigner une fonction:

OnByteProcess = &VirtualProcessor::_ByteProcessDefaultEvent;

J'espère que ça vous aidera.

Patrick

david wrote:
J'ai un probleme de compilation sous Borland Builder 3 avec ceci :
(il est a noter que je tiens a garder une ecriture C++ universelle)
Le message du compilateur: "Cannot convert'char &(*(__closure)())()' to
'char &(*)()'."


voici un extrait de l'entete VP.h :

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
class VirtualProcessor
{
public :

VirtualProcessor();
~VirtualProcessor();

char &(OnByteProcess)(void);

// [...]

}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


et un extrait du fichier source VP.cpp :
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
char & VirtualProcessor::_ByteProcessDefaultEvent(void)
{
// [...]
}

VirtualProcessor::VirtualProcessor()
{
// [...]

OnByteProcess = &_ByteProcessDefaultEvent;

// L'ERREUR DU COMPILATEUR EST MENTIONEE A LA LIGNE CI-DESSUS
// "Cannot convert'char &(*(__closure)())()' to 'char &(*)()'."

// [...]
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


PS:
"__closure" est un mot clef rajoute au C++ par Borland.Il n'est supporte
que par les compilateur de cette marque. Il est necessaire pour rendre
en charge la VCL et est utilise lors de la declaration de gestionnaires
d'evenement.
Il se trouve que j'utilise effectivement la VCL dans ce programme, mais
pas dans cette unite que je destine a etre portee sous divers
environnements (UNIX, DOS, WIN).

MERCI d'avance pour l'aide que vous pourrez m'apporter.



Avatar
Christophe Lephay
"david" a écrit dans le message de
news:
J'ai un probleme de compilation sous Borland Builder 3 avec ceci :
(il est a noter que je tiens a garder une ecriture C++ universelle)
Le message du compilateur: "Cannot convert'char &(*(__closure)())()' to
'char &(*)()'."
...

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
class VirtualProcessor
{
public :
...

char &(OnByteProcess)(void);
...

}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */


et un extrait du fichier source VP.cpp :
...

OnByteProcess = &_ByteProcessDefaultEvent;
...


Outre la réponse de Patrick, sache que ce serait pas plus mal (voire mieux)
d'utiliser des objets-fonctions (foncteurs/functors). Outre le fait que la
syntaxe est plus claire qu'avec des pointeurs sur fonction, celà a
l'avantage de réduire bien plus le couplage entre ta classe et les
gestionnaires d'évènements (particulièrement comparés aux pointeurs sur
fonctions membres). Les foncteurs(*) offrent bien plus et de souplesse, et
de possibilités...

Chris

(*) je crois que, d'une manière plus générale que les foncteurs, le terme
"agent" est celui qui convient...

Avatar
Patrick Mézard
OnByteProcess = &VirtualProcessor::_ByteProcessDefaultEvent;


Précision: ceci n'est valable que si
VirtualProcessor::_ByteProcessDefaultEvent est une fonction statique et
non

une fonction membre ordinaire.


C'est le fait que l'appel se fasse du constructeur qui te fait dire ça ?
Sinon, en quoi ce qu'il a écrit nécessite que la méthode soit "static" ?
J'ai du louper un truc dans le contexte de ta réponse.

Patrick Mézard


Avatar
Loïc Joly
Patrick wrote:
Normalement en C++, on ne peut pas passer des pointeurs sur les
fonctions membres. Mais plus d'un compilateur le permet, surtout dans
le cas où le pointeur sur la fonction et la fonction font partie de la
même classe.


La notion de pointeur sur fonction membre existe. La seule différence
est qu'un pointeur sur fonction libre est d'un type différent de celui
d'un pointeur sur fonction membre (même statique).

On peut passer des pointeurs sur fonction membre, est c'est même assez
courant (voir par exemple std::mem_fun).

--
Loïc

Avatar
kanze
Christophe de Vienne wrote in message
news:<newscache$yooehh$6vo$...

Patrick wrote:

OnByteProcess = &VirtualProcessor::_ByteProcessDefaultEvent;


Précision: ceci n'est valable que si
VirtualProcessor::_ByteProcessDefaultEvent est une fonction statique
et non une fonction membre ordinaire.


Au contraire, vue qu'il a déclaré :

char (*VirtualProcessor::*OnByteProcess)() ;

L'adresse d'une fonction membre statique, c'est la même chose que
l'adresse d'une fonction non-membre.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, Tél. : +33 (0)1 30 23 45 16


Avatar
Arnaud Meurgues
Michel Leunen wrote:

Le message du compilateur: "Cannot convert'char &(*(__closure)())()'
to 'char &(*)()'."



Le message du compilo te dit que tu essaies d'assigner à un pointeur de
fonction non-membre un pointeur vers une fonction membre.


C'est ce que je me suis dit en première lecture. Mais j'ai du mal à lire
ça dans le message du compilateur.

Arnaud


Avatar
Christophe de Vienne
wrote:

Christophe de Vienne wrote in message
news:<newscache$yooehh$6vo$...

Patrick wrote:

OnByteProcess = &VirtualProcessor::_ByteProcessDefaultEvent;


Précision: ceci n'est valable que si
VirtualProcessor::_ByteProcessDefaultEvent est une fonction statique
et non une fonction membre ordinaire.


Au contraire, vue qu'il a déclaré :

char (*VirtualProcessor::*OnByteProcess)() ;

L'adresse d'une fonction membre statique, c'est la même chose que
l'adresse d'une fonction non-membre.



oups !

--
Christophe de Vienne
Experience is something you don't get until just after you need it.
Oliver's Law.



Avatar
Jean-Marc Bourguet
Arnaud Meurgues writes:

Michel Leunen wrote:

Le message du compilateur: "Cannot convert'char &(*(__closure)())()' to
'char &(*)()'."
Le message du compilo te dit que tu essaies d'assigner à un pointeur de

fonction non-membre un pointeur vers une fonction membre.


C'est ce que je me suis dit en première lecture. Mais j'ai du mal à lire ça
dans le message du compilateur.


Closure est vraissemblablement le nom que Borland a donne a cette
extension.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org