Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C++] Problema definizione di opertore +

    Sto svolgendo un progetto di un array dinamico di tipo qualunque T,

    in dvector.h ho tutte le funnzioni di normale funzionamento del vettore e lì non ci sono problemi
    Sempre in dvector.h ho una nested class iterator

    codice:
    template <class T,class Functor> class DVector{
            //funzioni e attributi.......
    
             class iterator {
                 //funzioni della classe iterator
             }
    
             iterator begin(){............}   //funzione che ritorna l'iteratore che punta al primo dato dell'array
    
    }
    Ora voglio definire un opertore globale + di questo tipo: n+i dove n è un intero e i è un iteratore, metto in fondo questo:

    codice:
    template<typename T,typename Functor> typename DVector<T,Functor>::iterator &operator+(const int &n,const typename  DVector<T,Functor>::iterator &ma){
    	return ma+n;	
    }
    lasciando perdere cosa fa ma+n che vi assicuro al 100% che non da errori, questo codice compila perfettamente ma nel momento in cui nel main faccio:

    codice:
    DVector<int,isMoreOperator> a;       //lasciate perdere a cosa serve il funtore "isMoreOperator", non è il nostro problema
    3+a.begin();
    questo da errore:
    no match for ‘operator+’ in ‘3 + DVector<T, Functor>::begin() const [with T = int, Functor = isMoreOperator]()’

    ovviamente ho incluso il file.h nel mainì
    Avete idea da dove possa provenire questo errore?
    Perchè non trova la funzione?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    a.begin(); non è di tipo DVector<int,Functor>, ma di tipo iteratore (se hai fatto bene le cose).
    Al limite definisci un operatore di deferenziazione * che opera sull' iteratore e restituisce un DVector<T, Functor>; Così puoi dichiarare:

    codice:
    3+*(a.begin());

  3. #3
    Ma infatti begin( ) ritorna un iteratore e io l'operatore + voglio definirlo tra un intero e un operatore. non voglio incrementare il dato puntato di 3, voglio incrementare l'iteratore di 3! (cioè mandarlo avanti di 3 "caselle" dell'array)

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Hai definito l' operatore + nella classe iteratore? Comunque l' espressione viene solo calcolata (semmai eliminata se il compilatore ottimizza bene il codice), ma non c'è alcun assegnamento.

  5. #5
    Sono riuscito a definire l'operatore + in versione postfissa ( iteratore + numero ) direttamente nella classe iteratore:

    codice:
    iterator operator+(const int &n)const {return iterator(ptr+n);} // ptr è un puntatore
    e va normalmente. Ora voglio definire l'operatore in versione prefissa (numero + iteratore) e ho letto in giro che in questo caso non è possibile definire l'operatore direttamente la classe iterator ma va definito come operatore globale. Se mi sbaglio comunque se riuscite a farmi vedere la sintassi per definirlo all'interno della classe iterator mi va bene comunque!

  6. #6
    c'è nessuno che mi può aiutare?

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Ora voglio definire l'operatore in versione prefissa (numero + iteratore) e ho letto in giro che in questo caso non è possibile definire l'operatore direttamente la classe iterator ma va definito come operatore globale.
    Fai così:

    codice:
    friend iterator operator+(const int& n, iterator& i)
    {
        return iterator(i.ptr+n);
    }

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non è possibile creare una versione "prefissa" dell'operatore con una funzione membro.
    E comunque non ne hai bisogno.
    Con:
    codice:
    iterator operator+(const int &n)const {return iterator(ptr+n);} // ptr è un puntatore
    hai definito l'operazione base da fare.
    Con:
    codice:
    template<typename T,typename Functor> 
    typename DVector<T,Functor>::iterator operator+(const typename  DVector<T,Functor>::iterator &ma, const int& n){
    	return ma+n;	
    }
    
    template<typename T,typename Functor> 
    typename DVector<T,Functor>::iterator operator+(const int &n,const typename  DVector<T,Functor>::iterator &ma){
    	return ma+n;	
    }
    ti crei le astrazioni che ti servono.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da shodan
    Non è possibile creare una versione "prefissa" dell'operatore con una funzione membro.
    E comunque non ne hai bisogno.
    Questa non la vedo come una soluzione, dovrebbe rinunciarci?
    Può usare una funzione friend anziché una funzione membro.

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non mi risulta che una funzione friend sia la stessa cosa di una funzione membro.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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.