Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012

    [C++] 'operator <<' is ambiguous

    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:
    codice:
    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 :
    codice:
    #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

    Help!

  2. #2
    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.

  3. #3
    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.

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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:

    codice:
    #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

    codice:
    #include "Expr.h"
    
    Expr::Expr(){
    	
    }
    
    // Overloading dell'operatore <<
    // Inseritore
    ostream &operator<<(ostream &stream, Expr expression)
    {
    	stream << "CIAOOO" << endl;
    	return stream;
    }
    File main.cpp

    codice:
    #include <iostream>
    #include "Expr.h"
    
    using namespace std;
    
    int main()
    {
    	cout << Expr();
    	return 0;
    }
    Il tutto funziona con MinGW, ma dovrebbe anche con VC,


    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.