PDA

Visualizza la versione completa : [C++] 'operator <<' is ambiguous


iguana13
11-10-2004, 19:45
Linguaggio: C++
Compilatore: Visual C++ 6

Ho creato una mia classe "Expr" che fa l'overloading dell'operatore << (crea un inseritore)
Il codice della classe (parziale) questo:


class Expr
{
//...
public:
// Costruttore senza parametri
Expr();
//...
friend ostream &operator<<(ostream& stream, Expr expression);
};

// Overloading dell'operatore <<
// Inseritore
ostream &operator<<(ostream &stream, Expr expression)
{
stream << "CIAOOO" << endl;
return stream;
}


main.cpp :


#include <iostream>
#include "Expr.h"

using namespace std;

int main()
{
cout << Expr();
return 0;
}


L'errore che mi d il compilatore :
Compiling...
main.cpp
C:\Documents and Settings\Andrea\Desktop\Programmazione\C-C++\Progetti\ExprClass\main.cpp(14) : error C2593: 'operator <<' is ambiguous
Error executing cl.exe.

ExprClass.exe - 1 error(s), 0 warning(s)

Ormai le ho provate tutte, non so pi dove sbattere la testa :dh:

Help!

Andrea Simonassi
11-10-2004, 20:48
Se il tuo codice consiste solo di ci che hai postato dovrebbe essere corretto, a patto che tu abbia incluso <ostream> nel file header che dichiara la classe Expr e che tu abbia definito da qualche parte un corpo per il costruttore (cosa che manca nel codice postato).

Probabilmente qualche altro pezzo di codice che crea problemi.

Andrea Simonassi
11-10-2004, 21:18
A proposito se usi VC++ meglio che installi un service pack, perch c'erano diversi BUG nel VC, la maggior parte corretti col Service Pack 3, ma adesso in linea il Service Pack 6.

anx721
12-10-2004, 13:46
Penso che l'errore dipenda dal fatto che hai definito l'operatore nel file header cosicch viene di fatto definito pi volte, tante volte qunte includi l'header. Quindi sposta la definizione nel file .cpp e nell'header metti anche le direttive

#ifned EXPRE_H
#define EXPRE_H

come ho fatto io:

file Expr.h:



#ifndef EXPR_H
#define EXPR_H

#include <ostream>
#include <iostream>

using namespace std;
class Expr
{
//...
public:
// Costruttore senza parametri
Expr();
//...
friend ostream &operator<<(ostream& stream, Expr expression);
};


#endif

file Expr.cpp



#include "Expr.h"

Expr::Expr(){

}

// Overloading dell'operatore <<
// Inseritore
ostream &operator<<(ostream &stream, Expr expression)
{
stream << "CIAOOO" << endl;
return stream;
}


File main.cpp



#include <iostream>
#include "Expr.h"

using namespace std;

int main()
{
cout << Expr();
return 0;
}


Il tutto funziona con MinGW, ma dovrebbe anche con VC,

:ciauz:

iguana13
12-10-2004, 14:55
Il codice completo non l'ho messo perch l'inizio di un progetto abbastanza ampio (l'emmesimo imterprete di espressioni algebriche).
Il costruttore ed il resto delle definizioni delle funzioni sono in Expr.cpp
Per paura di avere problemi di ridefinizione ho messo in cima ed in fondo ad ogni file le istruzioni al preprocessore per evitarlo.

Il service pack non era installato, grazie per avermelo ricordato.

E' una buna notizia che dovrebbe funzionare!

Loading