перегрузка "<<" с помощью стиля структуры (без класса) - PullRequest
5 голосов
/ 27 апреля 2010

У меня есть структура, которую я хотел бы вывести, используя 'std :: cout' или какой-либо другой поток вывода. Это возможно без использования классов?

Спасибо

#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;
}

Я пробовал другой синтаксис ', но я не могу заставить его работать.

Ответы [ 2 ]

11 голосов
/ 27 апреля 2010

Возможно, это ошибка копирования-вставки, но есть только несколько неправильных вещей. Во-первых, свободные функции не могут быть const, но вы пометили dump как таковой. Вторая ошибка заключается в том, что dump не возвращает значение, которое также легко исправляется. Исправьте те, и это должно работать:

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;
}
8 голосов
/ 27 апреля 2010

Для всех намерений и целей структуры являются классами в C ++, за исключением того, что их члены по умолчанию имеют значение public, а не private. Из-за оптимизации возможны незначительные различия, специфичные для реализации, но они не влияют на стандартную функциональность, которая одинакова для классов и структур в C ++.

Во-вторых, почему функция "dump"? Просто реализуйте это прямо в операторе потока:

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