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

    [C++] Template + friend ostream e istream

    Se ho questa classe template con queste funzioni friend all'interno:

    template<class T> class array
    {

    friend ostream& operator<< (ostream&,const array<T> );
    friend istream& operator>> (istream&,array<T>& ) ;
    };
    E ricevo questi warning:

    29 D:\Documenti\Template.cpp [Warning] friend declaration `std:stream& operator<<(std:stream&, array<T>)' declares a non-template function
    30 D:\Documenti\Template.cpp [Warning] friend declaration `std::istream& operator>>(std::istream&, array<T>& )' declares a non-template function
    29 D:\Documenti\Template.cpp [Warning] (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

    Che cosa dovrei fare? Ho capito che dovrei aggiungere <> prima del nome della funzione, e poi che "-Wno-non-template-friend" disabilita questi warning, ma non so dove metterlo...

    Se faccio solo la prima cosa, quella delle <>, aumentano gli errori altro che risolversi!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] Template + friend ostream e istream

    Originariamente inviato da December_
    Che cosa dovrei fare?
    Personalmente preferisco evitare il ginepraio di cui sotto, scrivendo direttamente il codice della funzione nel corpo della classe. Altrimenti:
    codice:
    // Forward declaration
    template<class T> class array;
    
    // Dichiarazione prototipi
    template <class T>
    friend ostream& operator<< (ostream&,const array<T> );
    
    template <class T>
    friend istream& operator>> (istream&,array<T>& ) ;
    
    // Definizione classe.
    template<class T> class array
    {
    
    friend ostream& operator<< (ostream&,const array<T>& );
    friend istream& operator>> (istream&,array<T>& ) ;
    };
    
    // Definizione delle funzioni friend.
    template <class T>
    friend ostream& operator<< (ostream&,const array<T> ) {
        /* corpo funzione */
    }
    
    friend istream& operator>> (istream&,array<T>& ) {
        /* corpo funzione */
    }
    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.

  3. #3
    Che poi, io non ho mai capito 'sta mania di rendere friend gli operatori di inserimento ed estrazione da stream... in fin dei conti, non è altro che un modo per scrivere/leggere delle proprietà della classe, e salvo casi eccezionali queste dovrebbero essere già leggibili/scrivibili tramite metodi public, e che quindi sarebbero accessibili ad operator>> e operator<< anche se questi ultimi non fossero friend.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    MiItaly ti assicuro che lo eviterei volentieri se non fosse nelle richieste, dato tutti gli errori che mi dà...

    Grazie per le risposte, appena ho tempo provo a cambiare il codice come detto.

  5. #5
    Originariamente inviato da December_
    MiItaly ti assicuro che lo eviterei volentieri se non fosse nelle richieste, dato tutti gli errori che mi dà...
    Nono, ma io non ce l'ho con te, dico che la vedo come tendenza generale dei corsi e dei libri di C++ e non ne capisco il motivo (cioè, in parte lo capisco, ma secondo me è sbagliato e inutile).

    P.S.: MItaly, non MiItaly.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Nono, ma io non ce l'ho con te, dico che la vedo come tendenza generale dei corsi e dei libri di C++ e non ne capisco il motivo (cioè, in parte lo capisco, ma secondo me è sbagliato e inutile). P.S.: MItaly, non MiItaly.
    Perdona MItaly, distrazione, comunque sono d'accordo con la tua opinione.

    Personalmente preferisco evitare il ginepraio di cui sotto, scrivendo direttamente il codice della funzione nel corpo della classe. Altrimenti:
    Mettendo il codice all'interno, sembra funzionare ! Grazie mille.

  7. #7
    Mentre per fare la sovrapposizione di operatori come += e ==, devo aggiungere qualcosa di particolare per le classi template?

    Perchè in compilazione è tutto liscio, durante l'esecuzione cioè quando è il momento di usarli effettivamente, no. "no match for operator..."

    Le funzione per la sovrapposizione le ho implementate come ho sempre fatto, solo che io le usavo per classi "normali" - e funzionavano.

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da December_
    Mentre per fare la sovrapposizione di operatori come += e ==, devo aggiungere qualcosa di particolare per le classi template?
    Se le dichiari e definisci nel corpo della classe, no. Ma dovresti mostrare il codice.
    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
    Originariamente inviato da shodan
    Se le dichiari e definisci nel corpo della classe, no. Ma dovresti mostrare il codice.
    Vorrei evitare in effetti di definire tutto all'interno...

    codice:
    //dichiarazione all'interno della classe
    T* operator+= (T*);
    
    //implementazione
    template<class T>  T* array<T>::operator+=(T* A){
        for(int i=0; i<A.size; i++)
                this->vettore[this->size+i] = A.vettore[i];
       
       return this->vettore;           
       }
    Errore:

    180 D:\Documenti\Template.cpp no match for 'operator+=' in 'B += A'
    note D:\Documenti\Template.cpp:136 candidates are: T* array<T>:perator+=(T*) [with T = int]

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da December_
    Vorrei evitare in effetti di definire tutto all'interno...

    180 D:\Documenti\Template.cpp no match for 'operator+=' in 'B += A'
    note D:\Documenti\Template.cpp :136 candidates are: T* array<T>:perator+=(T*) [with T = int]
    Non puoi nemmeno mettere il codice template in un file cpp e compilarlo però.
    Dovresti spostare l'implementazione nel file .h e renderla inline.
    Nota che operator+= è un operatore che è obbligatorio sia membro della classe, per cui ti eviti tutto il ginepraio, ma essendo template non può essere stare in un file.cpp.
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.