ostream_iterator - C++ - Programmation
Marsh Posté le 21-03-2009 à 08:25:00
ReplyMarsh Posté le 21-03-2009 à 14:32:04
Joel F a écrit : get n'est pas const ... |
et quand je mets get const , ça m'emmène dans d'autre problème, je modifie le stringstream, donc je dois le déclarer mutable ? si oui j'ai encore d'autre problème, concernant les constructeur de recopie et = qui ne sont pas accesible, j'essaye d'encapsuler ça dans un auto_ptr, mais ça ne marche pas mieux...
@Taz: pourquoi friend, oui je sais que l'utilisation des friend n'est pas souvent une bonne idée, là c'est juste que je me rappel plus de la syntaxe qui permet de s'en passer
Marsh Posté le 21-03-2009 à 14:48:24
bon avec le code ci-dessous ça marche, mais y pas plus simple/propre :
Code :
|
Marsh Posté le 21-03-2009 à 16:06:57
et d'ailleurs je ne comprends pas pourquoi je ss obligé d'écrire un const de copie et =, si je ne les écris pas , le compilo me marque :
struct 'MaClasse<T>' : pas de constructeur de copie disponible ou le constructeur de copie est déclaré 'explicit'
PS: ok pour le friend, il suffit d'ajouter une methode print(ostream& o) à la place
Marsh Posté le 21-03-2009 à 17:00:30
# void Swap(const MaClasse<T> & m)
# {
# MaClasse<T> mwc = *const_cast<MaClasse<T>*>(&m);
# swap(m_,mwc.m_);
# swap(ss_,mwc.ss_);
# }
t'as pas l'impression de faire n'importe quoi là ?
Marsh Posté le 21-03-2009 à 17:02:37
oui ça m'a l'air un peu saboté, mais comment faire alors ?? au niveau du const jss coincé.
Oui bon effectivement en faisant des affectations au lieu des swap, ça roule, mais j'avais cru comprendre que de swappé c'était plus safe
Marsh Posté le 21-03-2009 à 20:35:08
weblook$$ a écrit : et d'ailleurs je ne comprends pas pourquoi je ss obligé d'écrire un const de copie et =, si je ne les écris pas , le compilo me marque : struct 'MaClasse<T>' : pas de constructeur de copie disponible ou le constructeur de copie est déclaré 'explicit' |
Le constructeur de recopie par défaut est déclaré explicit, et la classe vector à besoin d'un construeur de recopie qui ne le soit pas ?
Marsh Posté le 22-03-2009 à 16:02:32
c'ets le auto_ptr qui est non-copiable ...
Marsh Posté le 22-03-2009 à 17:44:27
Lorsque je regarde l'implémenation de auto_ptr dans memory... le constructeur de recopie est public, donc je comprends pas ta réponse
Dans cet article , auto_ptr est copié sans problème...
Code :
|
Marsh Posté le 22-03-2009 à 23:50:24
1) c'est bon problème localisé , le problème vient du fait que le constructeur de recopie dans la classe auto_ptr à un paramètre non const, et pour vector, du moins pour insérer des éléments dans une classe de type vector, il faut que la classe stockée ait un constructeur de recopie possédant un paramètre const...c'est quand même bien fait le C++
2) Et de plus je suis obligé de déclarer auto_ptr mutable, même si je ne le modifie pas dans une fonction const je veux dire, autrement
je me retrouve avec un problème de, auto_ptr: pas de constructeur de recopie de disponible, difficile de voir exactement où et pourquoi ça pêche
EDIT:
En faite ce bout de code permet de mieux comprendre ce qui se passe, j'ignorais la nécessité d'utiliser mutable dans
un cas comme celui-ci
Code :
|
Marsh Posté le 23-03-2009 à 08:07:06
oops ok en faite je me tirais une balle dans le pied au niveau du constructeur par recopie... comme le disais Joel,un auto_ptr ne se copie pas...
MaClasse(const MaClasse& m):
m_(m.m_),
ss_( std::auto_ptr<stringstream>(new stringstream()) )
{
}
Marsh Posté le 23-03-2009 à 08:15:41
c'est pas tellement que ça se copie pas, c'est que de toutes façons, ça veut dire transférer le contenu.
Marsh Posté le 21-03-2009 à 04:30:07
Hi,
Pourquoi est ce que ce code ne marche pas ? le compilateur m'indique :
error C2662: 'MaClasse::get' : impossible de convertir un pointeur 'this' de 'const MaClasse' en 'MaClasse &'
Merci
---------------