Surcharger l'opérateur << pour la classe valarray
Résolu/Fermé
perelman
Messages postés
57
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
6 septembre 2013
-
17 avril 2013 à 01:34
mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 - 20 avril 2013 à 13:01
mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 - 20 avril 2013 à 13:01
A voir également:
- Surcharger l'opérateur << pour la classe valarray
- Télécharger opera mini pour pc - Télécharger - Navigateurs
- 0758 quel opérateur - Forum Vos droits sur internet
- 0473 quel opérateur - Forum Loisirs / Divertissements
- Cen numéro est chez quel opérateur ? - Forum Opérateurs & Réseaux mobiles
- 0778 quel opérateur ✓ - Forum Mobile
7 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 avril 2013 à 08:29
17 avril 2013 à 08:29
je suppose que tu as essayé :
ça donne quoi ?
template <class ostream,typename _T>ostream& operator<<(ostream& os,valarray<_T>>;
ça donne quoi ?
perelman
Messages postés
57
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
6 septembre 2013
17 avril 2013 à 17:50
17 avril 2013 à 17:50
cooooool, ça marche trés bien meric char snipeur :)
Résultat : 10 20 30 40
#include <iostream> #include <valarray> using namespace std; template <class ostream,typename _T> ostream& operator<<(ostream& os,valarray<_T> array) { for ( int i(0); i < array.size(); i++) { os << array[i] << " "; } return os; } int main () { int init[]= {10,20,30,40}; valarray<int> foo (init, 4); // 10 20 30 40 cout << foo.size() << endl; cout << foo << endl; return 0; }
Résultat : 10 20 30 40
mamiemando
Messages postés
33433
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 décembre 2024
7 809
Modifié par mamiemando le 19/04/2013 à 01:38
Modifié par mamiemando le 19/04/2013 à 01:38
À mon avis il vaudrait mieux écrire
En effet :
- pas besoin de résolution template pour le ostream : si on regarde les classes C++ std::ofstream, std::ostringstream, elles héritent toutes de std::ostream. De std::cout ou std::cerr sont des std::ostream.
- la solution proposée repose sur un passage par recopie, bien plus coûteux qu'un passage par référence
Bonne chance
#include <ostream> template <typename T> std::ostream & operator << ( std::ostream & oss, const valarray<T> > & x ) { for(std::size_t i = 0; i < x.size(); ++i) { oss << x[i] << ' '; } return oss; }
En effet :
- pas besoin de résolution template pour le ostream : si on regarde les classes C++ std::ofstream, std::ostringstream, elles héritent toutes de std::ostream. De std::cout ou std::cerr sont des std::ostream.
- la solution proposée repose sur un passage par recopie, bien plus coûteux qu'un passage par référence
Bonne chance
perelman
Messages postés
57
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
6 septembre 2013
19 avril 2013 à 20:18
19 avril 2013 à 20:18
je l'ai essayé et ça marche nickel , juste j'ai un petit probléme qui est le suivant .
quand je mets cout << exp(foo) << endl; et on ne pas oubliant #include <cmath>
le compilateur hurle on me mettant une dizaine de ligne depuis depuis /usr/include /c++ . et merci encore pour ta réponse .
quand je mets cout << exp(foo) << endl; et on ne pas oubliant #include <cmath>
le compilateur hurle on me mettant une dizaine de ligne depuis depuis /usr/include /c++ . et merci encore pour ta réponse .
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mamiemando
Messages postés
33433
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 décembre 2024
7 809
20 avril 2013 à 00:41
20 avril 2013 à 00:41
Sans le message d'erreur ni le code c'est dur de répondre. C'est probablement que l'opérateur << n'est pas défini pour les opérandes auxquelles tu l'appliques. Normalement dans ce cas de figure, le compilateur te dit quels opérateurs << sont à ta disposition.
Autre précision, n'oublie pas que les fonctions/classes/structures templates doivent être implémentées dans un .hpp (sinon elles ne sont utilisables que dans le cpp dans lequel tu les as implémentées).
Autre précision, n'oublie pas que les fonctions/classes/structures templates doivent être implémentées dans un .hpp (sinon elles ne sont utilisables que dans le cpp dans lequel tu les as implémentées).
perelman
Messages postés
57
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
6 septembre 2013
20 avril 2013 à 12:29
20 avril 2013 à 12:29
Bonjour, c'est le même code que j'ai écrit en haut sauf que j'ai les changer par ta dernière instructions, du coup tout le code marche nickel sauf qu'on je lui dit de m'affficher par exemple cout << exp(foo) << endl; mais qu'on je lui mets
bar = exp(foo); et après cout << bar << endl; il y'a pas de probléme .
voila ce qu'il me mets comme erreur :
lien ----> http://img688.imageshack.us/img688/8075/erreursj.png
bar = exp(foo); et après cout << bar << endl; il y'a pas de probléme .
voila ce qu'il me mets comme erreur :
lien ----> http://img688.imageshack.us/img688/8075/erreursj.png
mamiemando
Messages postés
33433
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 décembre 2024
7 809
Modifié par mamiemando le 20/04/2013 à 13:03
Modifié par mamiemando le 20/04/2013 à 13:03
Je suppose que tu te bases sur cette exemple ?
http://www.cplusplus.com/reference/valarray/exp/
Du coup le code serait :
Sortie :
Bonne chance
http://www.cplusplus.com/reference/valarray/exp/
Du coup le code serait :
#include <iostream> #include <cmath> #include <valarray> #include <ostream> template <typename T> std::ostream & operator << ( std::ostream & out, const std::valarray<T> & x ) { out << "[ "; for (std::size_t i = 0; i < x.size(); ++i) { out << x[i] << ' '; } out << ']'; return out; } int main () { double val[] = {1.1, 2.2, 4.4, 8.8}; std::valarray<double> foo(val, 4); std::valarray<double> bar = exp(foo); std::cout << "foo: " << foo << std::endl << "bar: " << bar << std::endl; return 0; }
Sortie :
foo: [ 1.1 2.2 4.4 8.8 ] bar: [ 3.00417 9.02501 81.4509 6634.24 ]
Bonne chance