::erase(TArticle * const *)'
::erase(TArticle * const *)'
::erase(TArticle * const *)'
::erase(TArticle * const *)'
::erase(TArticle * const *)'
::erase(TArticle * const *)'
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le saute
// par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}
file://---------------------------------------------------------------------
----------------------------------------------------------------
std::vector<TArticle*>::const_iterator TCoArticles::SearchArticle(const
TArticle &Art)
{
return std::find(_pArtList.begin(),_pArtList.end(),&Art);
}
file://---------------------------------------------------------------------
----------------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle *>::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
merci encore de vos reponse et aide
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le saute
// par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}
file://---------------------------------------------------------------------
----------------------------------------------------------------
std::vector<TArticle*>::const_iterator TCoArticles::SearchArticle(const
TArticle &Art)
{
return std::find(_pArtList.begin(),_pArtList.end(),&Art);
}
file://---------------------------------------------------------------------
----------------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle *>
::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
merci encore de vos reponse et aide
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le saute
// par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}
file://---------------------------------------------------------------------
----------------------------------------------------------------
std::vector<TArticle*>::const_iterator TCoArticles::SearchArticle(const
TArticle &Art)
{
return std::find(_pArtList.begin(),_pArtList.end(),&Art);
}
file://---------------------------------------------------------------------
----------------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle *>::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
merci encore de vos reponse et aide
Projet fait sur Borland C++Builder 6 et Windows 98 code guard active
option de complition standard faut il changer une option ?
autre precison outil UML utilise ClassBuilder 2.4 gratuit generation
du squellette des classes uniquement
bool TCoArticles::DeleteArticle(TArticle& Art)
{
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le
saute // par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}
file://----------------------------------------------------------------
-----
----------------------------------------------------------------------
Autre question ai je les bon header ?
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
file://----------------------------------------------------------------
----- ----------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle
*>::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
merci encore de vos reponse et aide
Projet fait sur Borland C++Builder 6 et Windows 98 code guard active
option de complition standard faut il changer une option ?
autre precison outil UML utilise ClassBuilder 2.4 gratuit generation
du squellette des classes uniquement
bool TCoArticles::DeleteArticle(TArticle& Art)
{
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le
saute // par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}
file://----------------------------------------------------------------
-----
----------------------------------------------------------------------
Autre question ai je les bon header ?
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
file://----------------------------------------------------------------
----- ----------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle
*>
::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
merci encore de vos reponse et aide
Projet fait sur Borland C++Builder 6 et Windows 98 code guard active
option de complition standard faut il changer une option ?
autre precison outil UML utilise ClassBuilder 2.4 gratuit generation
du squellette des classes uniquement
bool TCoArticles::DeleteArticle(TArticle& Art)
{
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le
saute // par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}
file://----------------------------------------------------------------
-----
----------------------------------------------------------------------
Autre question ai je les bon header ?
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
file://----------------------------------------------------------------
----- ----------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle
*>::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
merci encore de vos reponse et aide
"Olivier" a écrit dans le message de
news:3f2cddaf$0$27407$bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le saute
Qu'est-ce que ça veut dire, il le saute ?
en mode pas a pas le compliateur n'execute pas le bloc d'instruction
// par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}
file://---------------------------------------------------------------------
----------------------------------------------------------------
std::vector<TArticle*>::const_iterator TCoArticles::SearchArticle(const
TArticle &Art)
{
return std::find(_pArtList.begin(),_pArtList.end(),&Art);
}
file://---------------------------------------------------------------------
----------------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle *>::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
L'erreur c'est que le type de it et de ta fonction SearchArticle est un
const_iterator. C'est normal que tu puisses pas t'en servir pour supprimer
des éléments dans ton vector...
Chris
merci encore de vos reponse et aide
"Olivier" <osarda@free.fr> a écrit dans le message de
news:3f2cddaf$0$27407$626a54ce@news.free.fr...
bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le saute
Qu'est-ce que ça veut dire, il le saute ?
en mode pas a pas le compliateur n'execute pas le bloc d'instruction
// par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}
file://---------------------------------------------------------------------
----------------------------------------------------------------
std::vector<TArticle*>::const_iterator TCoArticles::SearchArticle(const
TArticle &Art)
{
return std::find(_pArtList.begin(),_pArtList.end(),&Art);
}
file://---------------------------------------------------------------------
----------------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle *>
::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
L'erreur c'est que le type de it et de ta fonction SearchArticle est un
const_iterator. C'est normal que tu puisses pas t'en servir pour supprimer
des éléments dans ton vector...
Chris
merci encore de vos reponse et aide
"Olivier" a écrit dans le message de
news:3f2cddaf$0$27407$bool bResúlse;
if (Count()>0){ // size()
std::vector<TArticle*>::const_iterator it=NULL;
it= SearchArticle(Art);
// if(it!=_pArtList.end()){ // ce test ne marche pas il le saute
Qu'est-ce que ça veut dire, il le saute ?
en mode pas a pas le compliateur n'execute pas le bloc d'instruction
// par contre si je fait
if(it){ // ce test passe mais sur delete *it j'ai une violation
d'acces
_pArtList.erase( _pArtList.begin()+ (it -_pArtList.end())) ;
delete *it;
bRes=true;
}
}else{
TMyError Err(7,"Collection d'article est vide");
throw Err;
}
return bRes;
}
file://---------------------------------------------------------------------
----------------------------------------------------------------
std::vector<TArticle*>::const_iterator TCoArticles::SearchArticle(const
TArticle &Art)
{
return std::find(_pArtList.begin(),_pArtList.end(),&Art);
}
file://---------------------------------------------------------------------
----------------------------------------------------------------------
Si je fait _pArtList.erase(it)
bcb=>
[C++ Erreur] CoArticles.cpp(123): E2285 Impossible de trouver une
correspondance pour '_STL::vector<TArticle *,_STL::allocator<TArticle *>::erase(TArticle * const *)'
Le selecteur de fonction attend pArtList.erase(TArticle **__position)
ou pArtList.erase(TArticle
**__first,TArticle **__Last)
ou est l'erreur ?
L'erreur c'est que le type de it et de ta fonction SearchArticle est un
const_iterator. C'est normal que tu puisses pas t'en servir pour supprimer
des éléments dans ton vector...
Chris
merci encore de vos reponse et aide
writes:
[...]
| > Oui : comme le compilateur (sur sa machine) est assez idiot pour
| > ne pas mettre une structure qui contient uniquement un pointeur
| > dans un registre, il préfère que nous renoncions à un type
| > distinct de T*.
| C'est bête, mais j'avais oublié cette histoire-là. Si ça te rassure,
| g++ n'est pas le seul à être aussi idiot, loin de là. (Ce qui est
| curieux, parce qu'il me semble d'avoir lu des propos de Strustrup
| sur l'intérêt de passer des petites classes par des régistres il y a
| environ 12/13 ans, sinon plus. Je me démande s'il n'en a pas parlé
| dans la première version de TC++PL. Ce n'est donc pas vraiment une
| idée nouvelle.)
Oui. Le problème fondamental tel je le perçois est que l'ABI d'une
machine est souvent défini par des gens plutôt de la culture C, qui
n'ont pas beaucoup considéré qu'une structure ne veut pas forcément
dire gros (et qu'en conséquence, une structure peut très bien tenir
dans un registre).
Bien sûr la situation évolue peu à peu (par exemple PowerPC ne demande
pas qu'une structure passe systématiquement dans le tas). Mais nombre
de machines encore populaires (genre SPARC, x86) ont une attitude
assez abracadantesque envers les structs. Bien sûr, il appartient
aussi aux constructeurs de compilateurs de bien distinguer le fait que
C++ dispose d'au moins deux conventions d'appel (C++ et C) et ils ne
sont pas obligés de dire que la convention d'appel C++ est la même que
celle de C. Globalement, c'est une question d'avoir compris à quoi
sert un type.
L'intérêt de passer des petites classes dans des registres m'a
toujours paru évident, peut-être parce que je ne suis pas passé par la
case C avant d'arriver à C++.
[...]
| > Comme souvent, le problème est ailleurs et la solution effective
| > est d'enseigner au compilateur à inliner effectivement et virer
| > les junks. Car les opérations incriminées sont essentiellement
| > 1) lire la valeur brute du pointeur
| > 2) comparer les valeurs brutes de deux pointeurs.
| J'aurais pensé que le passage des paramètres et le retour des
| fonctions soient où la différence se fait le plus sentir.
La personne qui a fait la demande a donné
sort(v.begin(), v.end())
comme exemple, où v est un std::vector<T>.
| Si j'ai quelque chose
| comme :
| struct S { T* ptr } s1, s2 ;
| s1.ptr == s2.ptr ;
| avec tout visible au compilateur (grace aux fonctions inline), je me
| poserais vraiment des questions si le compilateur générait un code
| différent de ce qu'il aurait fait avec des pointeurs bruts.
Ce dont je parle est ceci
struct vector_iterator {
T* ptr;
};
inline bool
operator==(vector_iterator p, vector_iterator q)
{ return p.ptr == q.ptr; }
Le compilateur devrait faire son boulot et comprendre que p == q,
c'est p.ptr == q.ptr.
Mais tant qu'une partie des gens de middle end ou back end
maintiendront que le compilateur sait mieux que le programmeur et que
inline doit être traité comme register (i.e. sans signification) sans
tenir compte des usages et de la sémantique du langage, alors même
qu'on ne dispose pas de la technologie pour prétendre cela, on en
viendra à l'hérésie rapportée plus tôt.
| Le problème des paramètres et des retours de fonctions est un peu
| plus subtile, parce qu'il vaut mieux que le compilateur fasse la
| même chose au point de l'appel et dans la fonction (qui sont souvent
| dans deux unités de compilations différentes, compilées avec des
| options d'optimisation différentes). Passer une classe comme S,
| ci-dessus, pourrait poser des problèmes si on avait besoin ou d'un
| côté ou de l'autre. Et pour appeler une fonction membre, il en faut
| l'adresse.
Oui, mais cela ne démontre pas qu'on doive toujours passer par le tas.
La valeur de retour d'une fonction de type class est une rvalue, donc
on ne peut pas en prendre l'adresse. Pour un paramètre, on ne peut pas
en prendre l'adresse dans l'appelante, et dans l'appellée le paramètre
est une variable, donc a une adresse définie, on la traite comme les
autres paramètres.
kanze@gabi-soft.fr writes:
[...]
| > Oui : comme le compilateur (sur sa machine) est assez idiot pour
| > ne pas mettre une structure qui contient uniquement un pointeur
| > dans un registre, il préfère que nous renoncions à un type
| > distinct de T*.
| C'est bête, mais j'avais oublié cette histoire-là. Si ça te rassure,
| g++ n'est pas le seul à être aussi idiot, loin de là. (Ce qui est
| curieux, parce qu'il me semble d'avoir lu des propos de Strustrup
| sur l'intérêt de passer des petites classes par des régistres il y a
| environ 12/13 ans, sinon plus. Je me démande s'il n'en a pas parlé
| dans la première version de TC++PL. Ce n'est donc pas vraiment une
| idée nouvelle.)
Oui. Le problème fondamental tel je le perçois est que l'ABI d'une
machine est souvent défini par des gens plutôt de la culture C, qui
n'ont pas beaucoup considéré qu'une structure ne veut pas forcément
dire gros (et qu'en conséquence, une structure peut très bien tenir
dans un registre).
Bien sûr la situation évolue peu à peu (par exemple PowerPC ne demande
pas qu'une structure passe systématiquement dans le tas). Mais nombre
de machines encore populaires (genre SPARC, x86) ont une attitude
assez abracadantesque envers les structs. Bien sûr, il appartient
aussi aux constructeurs de compilateurs de bien distinguer le fait que
C++ dispose d'au moins deux conventions d'appel (C++ et C) et ils ne
sont pas obligés de dire que la convention d'appel C++ est la même que
celle de C. Globalement, c'est une question d'avoir compris à quoi
sert un type.
L'intérêt de passer des petites classes dans des registres m'a
toujours paru évident, peut-être parce que je ne suis pas passé par la
case C avant d'arriver à C++.
[...]
| > Comme souvent, le problème est ailleurs et la solution effective
| > est d'enseigner au compilateur à inliner effectivement et virer
| > les junks. Car les opérations incriminées sont essentiellement
| > 1) lire la valeur brute du pointeur
| > 2) comparer les valeurs brutes de deux pointeurs.
| J'aurais pensé que le passage des paramètres et le retour des
| fonctions soient où la différence se fait le plus sentir.
La personne qui a fait la demande a donné
sort(v.begin(), v.end())
comme exemple, où v est un std::vector<T>.
| Si j'ai quelque chose
| comme :
| struct S { T* ptr } s1, s2 ;
| s1.ptr == s2.ptr ;
| avec tout visible au compilateur (grace aux fonctions inline), je me
| poserais vraiment des questions si le compilateur générait un code
| différent de ce qu'il aurait fait avec des pointeurs bruts.
Ce dont je parle est ceci
struct vector_iterator {
T* ptr;
};
inline bool
operator==(vector_iterator p, vector_iterator q)
{ return p.ptr == q.ptr; }
Le compilateur devrait faire son boulot et comprendre que p == q,
c'est p.ptr == q.ptr.
Mais tant qu'une partie des gens de middle end ou back end
maintiendront que le compilateur sait mieux que le programmeur et que
inline doit être traité comme register (i.e. sans signification) sans
tenir compte des usages et de la sémantique du langage, alors même
qu'on ne dispose pas de la technologie pour prétendre cela, on en
viendra à l'hérésie rapportée plus tôt.
| Le problème des paramètres et des retours de fonctions est un peu
| plus subtile, parce qu'il vaut mieux que le compilateur fasse la
| même chose au point de l'appel et dans la fonction (qui sont souvent
| dans deux unités de compilations différentes, compilées avec des
| options d'optimisation différentes). Passer une classe comme S,
| ci-dessus, pourrait poser des problèmes si on avait besoin ou d'un
| côté ou de l'autre. Et pour appeler une fonction membre, il en faut
| l'adresse.
Oui, mais cela ne démontre pas qu'on doive toujours passer par le tas.
La valeur de retour d'une fonction de type class est une rvalue, donc
on ne peut pas en prendre l'adresse. Pour un paramètre, on ne peut pas
en prendre l'adresse dans l'appelante, et dans l'appellée le paramètre
est une variable, donc a une adresse définie, on la traite comme les
autres paramètres.
writes:
[...]
| > Oui : comme le compilateur (sur sa machine) est assez idiot pour
| > ne pas mettre une structure qui contient uniquement un pointeur
| > dans un registre, il préfère que nous renoncions à un type
| > distinct de T*.
| C'est bête, mais j'avais oublié cette histoire-là. Si ça te rassure,
| g++ n'est pas le seul à être aussi idiot, loin de là. (Ce qui est
| curieux, parce qu'il me semble d'avoir lu des propos de Strustrup
| sur l'intérêt de passer des petites classes par des régistres il y a
| environ 12/13 ans, sinon plus. Je me démande s'il n'en a pas parlé
| dans la première version de TC++PL. Ce n'est donc pas vraiment une
| idée nouvelle.)
Oui. Le problème fondamental tel je le perçois est que l'ABI d'une
machine est souvent défini par des gens plutôt de la culture C, qui
n'ont pas beaucoup considéré qu'une structure ne veut pas forcément
dire gros (et qu'en conséquence, une structure peut très bien tenir
dans un registre).
Bien sûr la situation évolue peu à peu (par exemple PowerPC ne demande
pas qu'une structure passe systématiquement dans le tas). Mais nombre
de machines encore populaires (genre SPARC, x86) ont une attitude
assez abracadantesque envers les structs. Bien sûr, il appartient
aussi aux constructeurs de compilateurs de bien distinguer le fait que
C++ dispose d'au moins deux conventions d'appel (C++ et C) et ils ne
sont pas obligés de dire que la convention d'appel C++ est la même que
celle de C. Globalement, c'est une question d'avoir compris à quoi
sert un type.
L'intérêt de passer des petites classes dans des registres m'a
toujours paru évident, peut-être parce que je ne suis pas passé par la
case C avant d'arriver à C++.
[...]
| > Comme souvent, le problème est ailleurs et la solution effective
| > est d'enseigner au compilateur à inliner effectivement et virer
| > les junks. Car les opérations incriminées sont essentiellement
| > 1) lire la valeur brute du pointeur
| > 2) comparer les valeurs brutes de deux pointeurs.
| J'aurais pensé que le passage des paramètres et le retour des
| fonctions soient où la différence se fait le plus sentir.
La personne qui a fait la demande a donné
sort(v.begin(), v.end())
comme exemple, où v est un std::vector<T>.
| Si j'ai quelque chose
| comme :
| struct S { T* ptr } s1, s2 ;
| s1.ptr == s2.ptr ;
| avec tout visible au compilateur (grace aux fonctions inline), je me
| poserais vraiment des questions si le compilateur générait un code
| différent de ce qu'il aurait fait avec des pointeurs bruts.
Ce dont je parle est ceci
struct vector_iterator {
T* ptr;
};
inline bool
operator==(vector_iterator p, vector_iterator q)
{ return p.ptr == q.ptr; }
Le compilateur devrait faire son boulot et comprendre que p == q,
c'est p.ptr == q.ptr.
Mais tant qu'une partie des gens de middle end ou back end
maintiendront que le compilateur sait mieux que le programmeur et que
inline doit être traité comme register (i.e. sans signification) sans
tenir compte des usages et de la sémantique du langage, alors même
qu'on ne dispose pas de la technologie pour prétendre cela, on en
viendra à l'hérésie rapportée plus tôt.
| Le problème des paramètres et des retours de fonctions est un peu
| plus subtile, parce qu'il vaut mieux que le compilateur fasse la
| même chose au point de l'appel et dans la fonction (qui sont souvent
| dans deux unités de compilations différentes, compilées avec des
| options d'optimisation différentes). Passer une classe comme S,
| ci-dessus, pourrait poser des problèmes si on avait besoin ou d'un
| côté ou de l'autre. Et pour appeler une fonction membre, il en faut
| l'adresse.
Oui, mais cela ne démontre pas qu'on doive toujours passer par le tas.
La valeur de retour d'une fonction de type class est une rvalue, donc
on ne peut pas en prendre l'adresse. Pour un paramètre, on ne peut pas
en prendre l'adresse dans l'appelante, et dans l'appellée le paramètre
est une variable, donc a une adresse définie, on la traite comme les
autres paramètres.
if((*it)==&Art){ // ce tes ne marche pas quel autre test a faire
?
if((*it)==&Art){ // ce tes ne marche pas quel autre test a faire
?
if((*it)==&Art){ // ce tes ne marche pas quel autre test a faire
?