Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c++] implementazione Classi annidate

    Buonasera,
    sto cercando di utilizzare delle classi annidate per creare un iteratore associato ad una classe myvector.
    Il file myVector.h contiene il codice:
    codice:
    template <typename T>
    class myVector
    {
    	public:
    		/* Costruttore */
    		myVector();
            
            class Iterator;
            friend class Iterator;
            class Iterator {
                private:
                    /*...........*/
                public:
                    Iterator(); /* Costruttore */
            };
            
            /* Restituisce un iteratore che punta ad elementi del vettore */
            Iterator first(); // Al primo elemento
            Iterator last(); // All'ultimo elemento
            
    };
    nel file .cpp il codice associato alle funzioni first e last è:

    codice:
    template <typename T> myVector<T>::Iterator myVector<T>::first()
    {
        Iterator myIter;
        myIter.position = head;
        return myIter;
    }
    
    template <typename T> myVector<T>::Iterator myVector<T>::last()
    {
        Iterator myIter;
        myIter.position = tail;
        return myIter;
    }
    ma mi restituisce l'errore
    codice:
    expected constructor, destructor, or type conversion before "myVector"
    non riesco a capire dov'è che sbaglio....
    L'aquilone è simbolo che l'uomo vuole andare più su

  2. #2

    Re: [c++] implementazione Classi annidate

    Modifica:

    codice:
    template <typename T> myVector<T>::Iterator myVector<T>::first()
    {
        Iterator myIter;
        myIter.position = head;
        return myIter;
    }
    
    template <typename T> myVector<T>::Iterator myVector<T>::last()
    {
        Iterator myIter;
        myIter.position = tail;
        return myIter;
    }
    con

    codice:
    template <typename T> typename myVector<T>::Iterator myVector<T>::first()
    {
        Iterator myIter;
        myIter.position = head;
        return myIter;
    }
    
    template <typename T> typename myVector<T>::Iterator myVector<T>::last()
    {
        Iterator myIter;
        myIter.position = tail;
        return myIter;
    }
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    nel file .cpp
    avrai un errore di linking.
    I template devono stare nello stesso header file e le funzioni (se non nel corpo della classe) avere lo specificatore: inline.
    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.

  4. #4
    Ho seguito le indicazioni di lolide e sembra che il problema sia risolto (sono riuscito a compilare il codice).

    Grazie per l'aiuto.

    Perseguendo l'obiettivo mi trovo ora a ridefinire gli operatori esterni + e - con il seguente codice:
    codice:
    template <typename T> typename myVector<T>::Iterator myVector<T>::Iterator::operator+(myVector<T>::Iterator it, int n);
            template <typename T> typename myVector<T>::Iterator myVector<T>::Iterator::operator-(myVector<T>::Iterator it, int n);
    queste righe le ho scritte al di fuori di ogni classe. Il compilatore risponde con

    `typename myVector<T>::Iterator myVector<T>::Iterator:perator+(myVector<T>::Iterator, int)' must take either zero or one argument
    no `typename myVector<T>::Iterator myVector<T>::Iterator:perator+(myVector<T>::Iterator, int)' member function declared in class `myVector<T>::Iterator'
    declaration of `typename myVector<T>::Iterator myVector<T>::Iterator:perator+(myVector<T>::Iterator, int)' outside of class is not definition
    template definition of non-template `typename myVector<T>::Iterator myVector<T>::Iterator:perator+(myVector<T>::Iterator, int)'

    mi potete aiutare anche con questo? grazie!
    L'aquilone è simbolo che l'uomo vuole andare più su

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se l'operatore è di tipo binario (cioè che prende due argomenti), non può essere membro della classe. Dev'essere definito fuori e friend.
    La cosa più comoda è incorporarlo direttamente nel corpo della classe, evitando contorsionismi dichiarativi.
    codice:
    class myVector<T> {
    
        ...
        class Iterator {
           ...
           friend Iterator operator+(Iterator it, int n) {
                return Iterator(it.dato_da_incrementare + n);    
           }
    
        }
    }
    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.

  6. #6
    Grazie mille shodan! Spero di non doverti disturbare più!
    L'aquilone è simbolo che l'uomo vuole andare più su

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.