2010-10-25 33 views
2

J'ai créé un type de données énuméré pour définir les longueurs de vol possibles. Je voudrais surcharger son opérateur < < afin que la représentation soit plus agréable.Impossible de surcharger << pour Enum en C++

Quand je compile, j'obtiens l'erreur (bien affiché pour être complet Fondamentalement multiple definitions of operator <<(ostream&, Categoria&).) Suivant:

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. 

Ceci est le fichier de données où les deux ENUM est déclarée et l'opérateur surchargé.

/* 
* 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: Je essayé référence const, const en valeur et la valeur non const. Aucun compilé

Répondre

14

erreurs multiples de l'éditeur de liens de définition parce que vous avez défini la fonction dans un fichier d'en-tête qui est inclus dans deux ou plusieurs unités de compilation.

Soit ajouter inline, comme

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

ou déplacer la définition dans un fichier de mise en œuvre (vous avez encore besoin d'une déclaration dans le fichier d'en-tête alors).

EDIT: PS: aussi, comme d'autres l'ont mentionné (je ne vois), passer le second argument en se référant à const, comme Categoria const& cat. Ou si Categoria est une énumération, transmettez-la en valeur.

EDIT 2: PPS: si vous déplacez la définition dans un fichier de mise en œuvre, puis de réduire les dépendances inutiles pour le code client, déplacer aussi le #include <iostream> dans le fichier de mise en œuvre et dans le fichier d'en-tête puis #include <iosfwd>.

+0

Accepté, merci. –

+3

"sacrément, je ne peux pas le voir ici pendant l'édition": pendant l'édition, il y a une barre grise sous le titre de la question que vous pouvez faire glisser pour révéler autant de texte de la question que nécessaire. –

+0

@Cheersandhth "anum" devrait être "enum" dans cette réponse. Je n'ai pas assez de rep pour faire un montage aussi petit. –

3

Regardez votre fonction:

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

Il ne peut correspondre à une variable d'énumération inscriptible ... faire le type Categoria ou const Categoria&.

+0

Bouchon éhonté: [Comment passer des objets à des fonctions en C++?] (Http://stackoverflow.com/questions/2139224/how-to-pass-objects-to-functions-in-c/2139254#2139254) – sbi

+0

N'a pas fonctionné, mais merci. –

+0

J'aurais dû regarder plus attentivement les erreurs de votre compilateur ... désolé! Bravo à Alf. –

2

Essayez comme ceci:

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

EDIT

doh définition multiple. Si vous préférez définir une fonction dans un en-tête, puis au moins mis en ligne:

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; 
} 
+0

N'a pas fonctionné. Merci quand même! –

+0

Merci, cela a fonctionné, mais j'ai déplacé l'implémentation dans un fichier source. –