2014-07-15 7 views
0

Je prends une classe C++ et je n'arrive pas à trouver l'une des devoirs. On nous donne la classe suivante (que j'ai ajoutée à mon fichier .h, et on nous a dit de ne pas modifier), et on nous a dit d'implémenter la classe itérateur.Instancier un objet modèle dans un modèle

template <typename T> 
class IntegerRange 
{ 
public: 
    class iterator; 

    IntegerRange(T low, T high) : low_(low), high_(high) 
    { 
    assert(low <= high); 
    } 

    const iterator begin() const {return iterator(low_); } 
    const iterator end() const {return iterator(high_); } 

private: 
     const T low_, high_; 
}; 

On nous a donné les éléments suivants d'une façon dont il serait utilisé:

IntegerRange<int> r1(-2, 3); 
copy(r1.begin(), r1.end(), ostream_iterator<int>(cout, " ")); //-2 -1 0 1 2 

IntegerRange<unsigned> r2(0, 6); 
copy(r2.begin(), r2.end(), ostream_iterator<unsigned>(cout, " ")); //0 1 2 3 4 5 

Pour commencer, je viens d'essayer d'obtenir le code pour compiler afin que je puisse jouer avec et comprendre dehors, mais j'ai du mal avec même cela. J'ai ajouté le code suivant dans le même fichier .h, mais je reçois l'erreur « Implicit instanciation de membre non défini « IntegerRange :: iterator » »

template <typename T> 
class iterator 
{ 
public: 
    iterator(T data) : data_(data) {} 

private: 
    T data_; 
}; 

Je ne cherche pas d'avoir quelqu'un me dire comment faire l'ensemble de la mission - je me demandais comment je peux même le compiler? Merci! La pleine MAIN.CPP & fichiers IntegerRange.h ci-dessous:

//main.cpp 
#include <iostream> 
#include "IntegerRange.h" 
#include <algorithm> 
using std::copy; 
using std::cout; 
using std::ostream_iterator; 

int main() 
{ 
    IntegerRange<int> r1(-2, 3); 
    copy(r1.begin(), r1.end(), ostream_iterator<int>(cout, " ")); //-2 -1 0 1 2 

    IntegerRange<unsigned> r2(0, 6); 
    copy(r2.begin(), r2.end(), ostream_iterator<unsigned>(cout, " ")); //0 1 2 3 4 5 
    return 0; 
} 

//IntegerRange 
#ifndef Homework7_IntegerRange_h 
#define Homework7_IntegerRange_h 

#include <cassert> 

template <typename T> 
class iterator 
{ 
public: 
    iterator(T data) : data_(data) {} 

private: 
    T data_; 
}; 


template <typename T> 
class IntegerRange 
{ 
public: 
    class iterator; 

    IntegerRange(T low, T high) : low_(low), high_(high) 
    { 
    assert(low <= high); 
    } 

    const iterator begin() const {return iterator(low_); } 
    const iterator end() const {return iterator(high_); } 

private: 
    const T low_, high_; 
}; 

#endif 

Répondre

0

Astuce: (vous devez toujours mettre en œuvre ++ opérateurs, etc.)

#include <iostream> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

template <typename T> 
class IntegerRange 
{ 
public: 
    class iterator 
    { 
    public: 
     iterator(T data) : data_(data) {} 
     const T& operator*(){return data_;}; 
    private: 
     T data_; 
    }; 

    IntegerRange(T low, T high) : low_(low), high_(high) 
    { 
     assert(low <= high); 
    } 

    const iterator begin() const {return iterator(low_); } 
    const iterator end() const {return iterator(high_); } 

private: 
    const T low_, high_; 
}; 


int main() 
{ 
    IntegerRange<int> r1(-2, 3); 
    auto it=r1.begin(); 
    cout << *it << endl; 
} 
0

Si vous voulez transmettre class iterator déclarer déclarer en dehors de class IntegerRange. Ou vouliez-vous le déclarer comme classe friend? par exemple,

template <typename T> 
class IntegerRange 
{ 
public: 
    friend class iterator; 

    // ... 
}; 
+0

Désolé, aurait dû mentionner, l'attribution spécifiée que nous ne devrions pas modifier la définition de la classe IntegerRange – Brian

2

IntegerRange définit une classe interne iterator.

template <typename T> 
class IntegerRange 
{ 
public: 
    class iterator; // forward declaration 
    ... 

je pense, le problème est que vous n'êtes pas implémentez une classe interne de IntegerRange mais une classe autonome:

template <typename T> 
class iterator 
{ 
public: 
    iterator(T data) : data_(data) {} 
    ... 

Ainsi, le compilateur pense qu'il est une classe sans rapport complet. Essayez de déplacer votre implémentation de iterator dans la classe IntegerRange (par exemple, en remplaçant la déclaration forward par votre implémentation).

Comme vous avez dit, vous ne devez pas mettre à jour la classe IntegerRange, vous devez qualifier la classe iterator utilisant cette idée:

class MyOuterClass::MyInnerClass 
{ 
    // ... 
}; 
+0

Cela semble avoir aidé - bien que maintenant je reçois une erreur qui dit "Opérandes invalides à binaire express ion ('IntegerRange :: itérateur' et 'IntegerRange :: itérateur') en référence à la fonction de copie – Brian

Questions connexes