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 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 - 20 avril 2013 à 13:01
Bonjour,
je voudrais savoir comment je pourrai surcharger l'opèrateur << pour la classe valarray
pour que je puisse faire :

valarray<double> a(1e0, 3);

cout << a << endl;

a la place de faire une boucle entier ,et merci beaucoup pour vos réponses .

7 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 avril 2013 à 08:29
je suppose que tu as essayé :
template <class ostream,typename _T>ostream& operator<<(ostream& os,valarray<_T>>;

ça donne quoi ?
0
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
cooooool, ça marche trés bien meric char snipeur :)

#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
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
Modifié par mamiemando le 19/04/2013 à 01:38
À mon avis il vaudrait mieux écrire

#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
0
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
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 .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
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).
0
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
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
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
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 :

#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
0