Surcharger l'opérateur << pour la classe valarray

Résolu
perelman Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33758 Date d'inscription   Statut Modérateur Dernière intervention   -
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 .
A voir également:

7 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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   Statut Membre Dernière intervention  
 
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 33758 Date d'inscription   Statut Modérateur Dernière intervention   7 877
 
À 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   Statut Membre Dernière intervention  
 
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 33758 Date d'inscription   Statut Modérateur Dernière intervention   7 877
 
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   Statut Membre Dernière intervention  
 
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 33758 Date d'inscription   Statut Modérateur Dernière intervention   7 877
 
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