Не могу перегрузить << для Enum в C ++ - PullRequest
2 голосов
/ 25 октября 2010

Я создал перечислимый тип данных для определения возможной длины полета. Я хотел бы перегрузить его оператор <<, чтобы представление было лучше. </p>

Когда я компилирую это, я получаю следующую ошибку (опубликованную для полноты картины. В основном multiple definitions of operator <<(ostream&, Categoria&)):

g++ -oProjectoAEDA.exe src\voo.o src\tui.o src\tripulante.o src\tipoaviao.o src\manga.o src\main.o src\datahora.o src\companhiaaerea.o src\aviao.o src\aeroporto.o
src\tripulante.o: In function `ZlsRSoR9Categoria':
c:/mingw/bin/../lib/gcc/i686-pc-mingw32/4.5.1/../../../../include/c++/4.5.1/new:103: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
src\tipoaviao.o: In function `ZlsRSoR9Categoria':
c:/mingw/bin/../lib/gcc/i686-pc-mingw32/4.5.1/../../../../include/c++/4.5.1/new:103: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
src\manga.o: In function `ZlsRSoR9Categoria':
c:/mingw/bin/../lib/gcc/i686-pc-mingw32/4.5.1/../../../../include/c++/4.5.1/new:103: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
src\main.o: In function `ZlsRSoR9Categoria':
C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
src\companhiaaerea.o: In function `ZlsRSoR9Categoria':
c:/mingw/bin/../lib/gcc/i686-pc-mingw32/4.5.1/../../../../include/c++/4.5.1/new:103: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
src\aviao.o: In function `ZlsRSoR9Categoria':
c:/mingw/bin/../lib/gcc/i686-pc-mingw32/4.5.1/../../../../include/c++/4.5.1/new:103: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
src\aeroporto.o: In function `ZlsRSoR9Categoria':
c:/mingw/bin/../lib/gcc/i686-pc-mingw32/4.5.1/../../../../include/c++/4.5.1/new:103: multiple definition of `operator<<(std::ostream&, Categoria&)'
src\voo.o:C:\Users\Francisco\workspace_aeda\ProjectoAEDA\Debug/../src//headers/categoria.h:20: first defined here
collect2: ld returned 1 exit status
Build error occurred, build is stopped
Time consumed: 928  ms.  

Это файл данных, в котором объявляется как enum, так и оператор перегружен.

/*
 * categoria.h
 *
 *  Created on: 9 de Out de 2010
 *      Author: Francisco
 */

#ifndef CATEGORIA_H_
#define CATEGORIA_H_

#include <iostream>

enum Categoria {
    LongoCurso,
    MedioCurso,
    Domestico
};

std::ostream& operator<<(std::ostream & os, Categoria & cat)
{
  switch (cat) {
  case LongoCurso:
      os << "Longo Curso";
      break;
  case MedioCurso:
      os << "Medio Curso";
      break;
  case Domestico:
      os << "Domestico";
  }
  return os;
}



#endif /* CATEGORIA_H_ */

EDIT: Я попробовал константную ссылку, константу по значению и не константное значение. Не скомпилировано.

Ответы [ 3 ]

15 голосов
/ 25 октября 2010

Многочисленные ошибки компоновщика определений, поскольку вы определили функцию в заголовочном файле, который включен в два или более блоков компиляции.

Либо добавьте inline, например

inline std::ostream& operator<<(std::ostream & os, Categoria & cat)

или переместите определение в файл реализации (тогда вам все равно понадобится объявление в заголовочном файле).

EDIT : PS: также, как уже упоминали другие (я этого не видел), передайте второй аргумент по ссылке на const, например, Categoria const& cat. Или, если Categoria - это перечисление, передайте его по значению.

РЕДАКТИРОВАНИЕ 2 : PPS: если вы переместите определение в файл реализации, то для уменьшения ненужных зависимостей для клиентского кода переместите также #include <iostream> в файл реализации, а затем в заголовочный файл #include <iosfwd>.

3 голосов
/ 25 октября 2010

Посмотрите на свою функцию:

std::ostream& operator<<(std::ostream & os, Categoria & cat) 

Может соответствовать только переписываемой переменной перечисления ... сделать тип Categoria или const Categoria&.

2 голосов
/ 25 октября 2010

Попробуйте вот так:

std::ostream &operator<<( std::ostream &os, const Categoria obj );

РЕДАКТИРОВАТЬ

до нескольких определений.Если вы предпочитаете определять функцию в заголовке, то, по крайней мере, вставьте строку:

inline
std::ostream &operator<<( std::ostream &os, const Categoria cat )
{
  switch (cat) {
  case LongoCurso:
      os << "Longo Curso";
      break;
  case MedioCurso:
      os << "Medio Curso";
      break;
  case Domestico:
      os << "Domestico";
  }
  return os;
}
...