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

Erreur de compilation: une astuce pour déchiffrer ?

4 réponses
Avatar
Patrick 'Zener' Brunet
Bonjour.

Affaire de bonnes pratiques.

Lors de la compilation de templates un peu complexes, il arrive fréquemment
que le compilo vous sorte un diagnostic qui se veut ultra-précis, mais qui
peut nécessiter un décryptage laborieux.
Voici un exemple de ce que vient de me sortir le mien (MS-VC++):

d:\codebase\music\cmmapbtree.h(1406) : error C2664: 'CompareWithKey' :
cannot convert parameter 1 from 'const class UtopiaMusic::CmMapBTree<void
*,void *,class UtopiaMusic::CmHolderByAddress<void *>,class
UtopiaMusic::CmHolderByValue<void *,0> >' to 'const class
UtopiaMusic::CmHeapClient *'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
d:\codebase\music\cmholders.h(98) : while compiling class-template
member function 'class UtopiaMusic::CmMapBTreeNode<void *,void *,class
UtopiaMusic::CmHolderByAddress<void *>,class
UtopiaMusic::CmHolderByValue<void *,0> > *__thiscall
UtopiaMusic::CmMapBTreeNode<void *,void *,class
UtopiaMusic::CmHolderByAddress<void *>,class
UtopiaMusic::CmHolderByValue<void *,0> >::Lookup(const class
UtopiaMusic::CmMapBTree<void *,void *,class
UtopiaMusic::CmHolderByAddress<void *>,class
UtopiaMusic::CmHolderByValue<void *,0> > &,void *const & ) const'

Waow ! Tout ça pour une * en trop...

Evidemment je pourrais appeler mes classes "titi" et "toto", ne pas utiliser
de namespaces et me limiter à un seul argument de template, ça rendrait le
dégluti plus lisible mais évidemment le résultat serait moins utile.

Je ne nie pas l'intérêt de la précision, mais en l'occurence:
cmmapbtree.h(1406) : error C2664: 'CompareWithKey' : cannot convert
parameter 1
...aurait suffi à me mettre la puce à l'oreille.

Dans certains cas, l'info essentielle se trouve plus loin... Si le compilo
pouvait me faire grâce des arguments de template, des conventions d'appel et
des namespaces par exemple (sachant que le plus souvent on les voit bien en
se reportant à la ligne fautive), ce serait visuellement plus évident.

J'avoue que je n'ai pas encore confronté ce type de code très complexe à de
multiples compilos, j'ignore si gcc par exemple est plus malin de ce point
de vue...

Quelles sont vos bonnes pratiques pour être plus efficaces dans
l'exploitation de tels messages d'erreur ?

Merci.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/

4 réponses

Avatar
Michel Decima

J'avoue que je n'ai pas encore confronté ce type de code très complexe à de
multiples compilos, j'ignore si gcc par exemple est plus malin de ce point
de vue...

Quelles sont vos bonnes pratiques pour être plus efficaces dans
l'exploitation de tels messages d'erreur ?


Utiliser un filtre qui reformatte la sortie du compilateur. J'avais
essayé STLfilt il y a longtemps avec gcc3.3, ca marchait pas mal.
Il semble que Visual C++ est supporté (mais pas gcc4...)

http://www.bdsoft.com/tools/stlfilt.html

Avatar
Patrick 'Zener' Brunet
Bonjour.

"Michel Decima" a écrit dans le message news:
f6ipjj$kro$

J'avoue que je n'ai pas encore confronté ce type de code très complexe à
de


multiples compilos, j'ignore si gcc par exemple est plus malin de ce
point


de vue...

Quelles sont vos bonnes pratiques pour être plus efficaces dans
l'exploitation de tels messages d'erreur ?


Utiliser un filtre qui reformatte la sortie du compilateur. J'avais
essayé STLfilt il y a longtemps avec gcc3.3, ca marchait pas mal.
Il semble que Visual C++ est supporté (mais pas gcc4...)

http://www.bdsoft.com/tools/stlfilt.html


Pas mal !
Mais il faut installer ActivePerl, donc en tout 9Mo de bin'z pour en arriver
là.
OK, je vais réfléchir...

Merci.

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/


Avatar
Michel Decima

http://www.bdsoft.com/tools/stlfilt.html


Pas mal !
Mais il faut installer ActivePerl, donc en tout 9Mo de bin'z pour en arriver
là.
OK, je vais réfléchir...


Je ne l'ai utilisé que sous Unix, donc perl etait déja installé ;)
Mais bon, si ca marche immédiatement sans autre travail que
l'installation, ca vaut peut etre mieux qu'un developpement supplémentaire.
Et puis j'ai cité cet outil parce que je le connais, mais il y en existe
peut-etre d'autre...


Avatar
Patrick 'Zener' Brunet
Bonjour.

"Michel Decima" a écrit dans le message news:
f6kulv$8at$

http://www.bdsoft.com/tools/stlfilt.html


Pas mal !
Mais il faut installer ActivePerl, donc en tout 9Mo de bin'z pour en
arriver là.
OK, je vais réfléchir...


Je ne l'ai utilisé que sous Unix, donc perl etait déja installé ;)
Mais bon, si ca marche immédiatement sans autre travail que
l'installation, ca vaut peut etre mieux qu'un developpement
supplémentaire.
Et puis j'ai cité cet outil parce que je le connais, mais il y en
existe peut-etre d'autre...



En fait ce qui m'inquiète avec cet outil (et celui utilisé dans les démos),
c'est de savoir si les règles sont vraiment génériques ou optimisées pour la
STL et autres librairies connues. En lisant les exemples (sur string
notamment) on peut se poser la question...

Il est clair que la STL constitue un exemple superbe pour ce problème, le
screenshot est sidérant, mais pour ma part et pour des raisons particulières
précisément liées à cette imbrication, je ne l'utilise pas dans mes classes.

En fait je rêvais d'un filtre simplificateur "zero knowledge", donc purement
syntaxique, qui soit simplement capable de vider les jeux d'arguments de
templates "internes", et pour le plus externe de laisser uniquement le
premier niveau, en déshabillant aussi tous les identifiants.

Par exemple:

'const class UtopiaMusic::CmMapBTree<void *,void *,class
UtopiaMusic::CmHolderByAddress<void *>,class
UtopiaMusic::CmHolderByValue<void *,0> >'

pourrait se réduire à:

'CmMapBTree<void*,void*,CmHolderByAddress<>,CmHolderByValue<>>'

(sans niveau de template supplémentaire pour un cas plus profond).

C'est très suffisant pour *repérer* l'argument fautif dans la ligne de code
source donnée avec son numéro et avec le diagnostic.
Et en général ça suffit. On peut toujours rajouter une option pour
désactiver la simplification pour les rares cas plus tordus.

Je crois que ça pourrait se faire assez facilement avec un utilitaire simple
capable de manier des RegExp, et d'encapsuler le compilo comme c'est fait
dans STLFILT...

Un jour où j'aurai le temps...

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/