2010-04-27 5 views
3

J'ai une structure que je voudrais sortir en utilisant 'std :: cout' ou un autre flux de sortie. Est-ce possible sans utiliser les classes?surcharger "<<" avec un style cout struct (no class)

Merci

#include <iostream> 
#include <fstream> 
template <typename T> 
struct point{ 
    T x; 
    T y; 
}; 

template <typename T> 
std::ostream& dump(std::ostream &o,point<T> p) const{ 
    o<<"x: " << p.x <<"\ty: " << p.y <<std::endl; 
} 


template<typename T> 
std::ostream& operator << (std::ostream &o,const point<T> &a){ 
    return dump(o,a); 
} 


int main(){ 
    point<double> p; 
    p.x=0.1; 
    p.y=0.3; 
    dump(std::cout,p); 
    std::cout << p ;//how? 
    return 0; 
} 

j'ai essayé une syntaxe différente mais je ne peux pas semblent le faire fonctionner.

+4

Il vaut la peine de noter que "sans utiliser de classes" n'est pas un qualificatif particulièrement utile dans ce cas. Il n'y a pas de différences fonctionnelles entre une structure et une classe sauf que les structures par défaut sont membres publics/héritage, alors que les classes sont privées par défaut. –

Répondre

9

C'est peut-être une erreur de copier-coller, mais il y a juste quelques erreurs. Premièrement, les fonctions libres ne peuvent pas être const, pourtant vous avez marqué dump en tant que tel. La deuxième erreur est que dump ne renvoie pas de valeur, ce qui est également facilement corrigé. Fix ceux-ci et il devrait fonctionner:

template <typename T> // note, might as well take p as const-reference 
std::ostream& dump(std::ostream &o, const point<T>& p) 
{ 
    return o << "x: " << p.x << "\ty: " << p.y << std::endl; 
} 
+0

merci, j'étais en effet copier-coller d'une classe précédente – monkeyking

+0

Le troisième était que le point à rejeter n'était pas marqué comme 'const'. GMan a également résolu cela. – sbi

7

Pour toutes fins utiles, struct sont classes en C++, sauf que leurs membres par défaut pour le public au lieu de privé. Il existe des différences mineures spécifiques à l'implémentation en raison de l'optimisation, mais elles n'ont aucun effet sur la fonctionnalité standard qui est la même pour les classes et les structures en C++. Deuxièmement, pourquoi avoir la fonction "dump" - il suffit de l'implémenter directement dans l'opérateur de flux.

template<typename T> 
std::ostream& operator << (std::ostream &o, const point<T> &a) 
    { 
    o << "x: " << a.x << "\ty: " << a.y << std::endl; 
    return o; 
    } 
Questions connexes