Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C++] Overloading <

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    8

    [C++] Overloading <

    Ciao a tutti.
    Prima di tutto ci tengo a fare i complimenti al forum (lecchinaggio mode on ), da un pò di tempo lo frequento per trovare risposte alle mie domande, ma questa è la prima volta che devo scrivere.

    Ho problemi con l'overloading dell'operatore < per l'esatezza.

    Ho creato una classe Arc:
    codice:
    class Arc
    {
    public:
    	Arc();
    	Arc(int id0, double w0);
    
    	bool operator< (Arc a);
    	bool operator> (Arc a);
    	bool operator== (Arc a);
    	bool operator>= (Arc a);
    	bool operator<= (Arc a);
    	void operator= (Arc a);
    
    	int getId();
    	double getW();
    	
    private:
    	int id;
    	double w;
    };
    
    ...
    
    bool Arc::operator< (Arc a)
    {
    	return w < a.w;
    }
    Quindi ho creato una priority_queue<Arc> e credo sia proprio a questo punto che mi da problemi, essendo necessario l'operatore <
    Ma comunque come vedete ho fatto l'overloading di quello come di tutti nel dubbio.

    L'errore è questo
    codice:
    1>c:\program files\microsoft visual studio 10.0\vc\include\xfunctional(125): error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Arc' (or there is no acceptable conversion)
    1>          c:\users\luca\desktop\progetto\progetto\arc.h(11): could be 'bool Arc::operator <(Arc)'
    1>          while trying to match the argument list '(const Arc, const Arc)'
    1>          c:\program files\microsoft visual studio 10.0\vc\include\xfunctional(124) : while compiling class template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
    1>          with
    1>          [
    1>              _Ty=Arc
    1>          ]
    1>          c:\program files\microsoft visual studio 10.0\vc\include\queue(360) : see reference to class template instantiation 'std::less<_Ty>' being compiled
    1>          with
    1>          [
    1>              _Ty=Arc
    1>          ]
    1>          c:\users\luca\desktop\progetto\progetto\progetto.cpp(28) : see reference to class template instantiation 'std::priority_queue<_Ty>' being compiled
    1>          with
    1>          [
    1>              _Ty=Arc
    1>          ]
    1>
    1>Build FAILED.
    E mi rimanda al del codice read only nominato xfunctional

    Sapete cosa posso fare?

  2. #2
    Gli operatori di confronto dovrebbero accettare un riferimento const ai loro argomenti ed essere loro stessi const, dal momento che un operatore di confronto non deve modificare nessuno degli oggetti su cui viene applicato; per cui:
    codice:
    	bool operator< (const Arc & a) const;
    Più info su const.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    8
    Risolto ora, grazie mille per l'illuminazione.
    Spero sia l'ultima di cui aver bisogno ora...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    8

    Come non detto...

    Immediatamente ecco un altro problema
    codice:
    >c:\program files (x86)\microsoft visual studio 9.0\vc\include\functional(132) : error C2678: binary '>' : no operator found which takes a left-hand operand of type 'const Arc' (or there is no acceptable conversion)
    1>        g:\uni\progetto\progetto\arc.h(12): could be 'bool Arc::operator >(const Arc &)'
    1>        while trying to match the argument list '(const Arc, const Arc)'
    1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\functional(131) : while compiling class template member function 'bool std::greater<_Ty>::operator ()(const _Ty &,const _Ty &) const'
    1>        with
    1>        [
    1>            _Ty=Arc
    1>        ]
    1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\queue(223) : see reference to class template instantiation 'std::greater<_Ty>' being compiled
    1>        with
    1>        [
    1>            _Ty=Arc
    1>        ]
    1>        g:\uni\progetto\progetto\progetto.cpp(29) : see reference to class template instantiation 'std::priority_queue<_Ty,_Container,_Pr>' being compiled
    1>        with
    1>        [
    1>            _Ty=Arc,
    1>            _Container=std::vector<Arc>,
    1>            _Pr=std::greater<Arc>
    1>        ]
    Il codice interessato dall'errore è il seguente:
    codice:
    typedef vector<priority_queue<Arc, vector<Arc>, greater<Arc>>> vpq;
    
    void stampaVPQ (vpq a, string s)
    {
    	for (int k=0; k<a.size(); k++)
    	{
    		priority_queue<Arc, vector<Arc>, greater<Arc> > temp= a[k];
    		int cont=0;
    		while(!temp.empty())
    		{
    			Arc ramo= temp.top();
    			temp.pop();
    			cout<< s << "[" << k << "][" << ramo.getId() << "]: " << ramo.getW() << endl;
    			cont++;
    		}
    	}
    }
    Con Arc:
    codice:
    Class Arc
    {
    public:
    	Arc();
    	Arc(int id0, double w0);
    
    	bool operator< (const Arc &a);
    	bool operator> (const Arc &a);
    	bool operator== (const Arc &a);
    	bool operator>= (const Arc &a);
    	bool operator<= (const Arc &a);
    	void operator= (const Arc &a);
    
    	const int getId();
    	const double getW();
    	
    private:
    	int id;
    	double w;
    };
    ...
    bool Arc::operator< (const Arc &a)
    {
    	return w < a.w;
    }
    
    bool Arc::operator > (const Arc &a)
    {
    		return w > a.w;
    }
    ...
    Da quel che capisco mi dice che non può usare il > per riordinare la priority_queue, come se ci fosse un errore nell'overloading.
    Però l'ho provato su degli arc non in una lista e funziona tutto...
    Nel momento di usarlo ocme funzione di oridnamento no invece.

    Non so proprio dove sbatterci la testa

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    8
    risolto anche questo.
    Semplciemente dovevo segnalre costante la funzione di overloading

    codice:
    bool Arc::operator> (const Arc &a) const
    {
    		return w > a.w;
    }

  6. #6
    Che poi era quello che ti avevo detto nella precedente risposta. Le funzioni di confronto infatti non possono avere side-effects sugli oggetti confrontati.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    8
    Originariamente inviato da Gatsu8
    risolto anche questo.
    Semplciemente dovevo segnalre costante la funzione di overloading

    codice:
    bool Arc::operator> (const Arc &a) const
    {
    		return w > a.w;
    }
    L'avevo messo sull'oepratore <, ma non sul maggiore.
    Poi usando greater anzichè less ovviamente andava ad usare il > ma li non vedevo più l'errore, ero in crisi ^^

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.