Hej udviklere,
jeg sidder og prøver at lave en templated class, som jeg kan bruge mere bredt - men jeg får et hav af compile fejl, så der er et eller andet jeg ikke helt har forstået. Jeg har været i adskillige bøger og tutorials m.m., og jeg håbede der var en der kunne hjælpe lidt.
Min klasse er et forsøg på at lave en mere anvendelig 2-dimensionel vektor. For at kunne løbe sådan en igennem skal jeg have en iterator der kan gå gennem alle elementer. Et forsøg:
template<class T>
class Grid 
{
   protected:
      std::vector<std::vector<T> > matrix;
      int x_size;
      int y_size;
   public:
      Grid(){}
      class iterator : public std::vector<T>::iterator
      {
            iterator& operator++()
            {
                for (int i = 0; i!= x_size-1; ++i)
                    if (*this = matrix[i].end()) return matrix[i+1].begin();
                else return *this + 1;
            }
      };
      iterator& begin() {return matrix[0].begin();}
      iterator& end() {return matrix[x_size].end();}
};
MinGW giver:
 Grid.h:121: error: `Grid<T>::iterator& Grid<T>::iterator::operator++() [with T = int]' is private
Map.cpp:25: error: within this context
Map.cpp:25: instantiated from here
Grid.h:122: error: invalid use of member (did you forget the `&' ?)
Grid.h:123: error: invalid use of nonstatic data member 'Grid<int>::matrix'
Grid.h:123: error: invalid use of nonstatic data member 'Grid<int>::matrix'
Map.cpp:25: instantiated from here
Grid.h:124: error: invalid initialization of non-const reference of type 'Grid<int>::iterator&' from a temporary of type '__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >'
Jeg prøver at nedarve en klasse Map der har en specifik definition af typen T, nemlig int:
//Map.h:
#include "Grid.h"
#include <stdexcept>
class Map : public Grid<int>  
{
 	public:
        Map(){loadSQSfile();}
		Map(const Map&);
		~Map(){}
		void loadSQSfile();
}; 
#endif
//Map.cpp:          //Den er kun med i eksemplet fordi der henvises til den i fejlmeddelelsen
#include "Map.h"
#include <iostream>
#include <fstream>
#include <stdexcept>
using std::ifstream;        using std::runtime_error;
using std::cout;            using std::cin;
void Map::loadSQSfile (){
    ifstream SQS_file("Worldmap.sqs");
    if (!SQS_file) throw runtime_error("No file \\"Worldmap.sqs\\" was found!");
    cout << "Which x (longitude) value denotes center of the lower left cell of the map?:  ";
    cin >> xllcenter;
    cout << "... and which y (latitude) value is at the center of the lower left cell?:   ";
    cin >> yllcenter;
    cout << "What is the cellsize of your map?:   ";
    cin >> cellsize;
    SQS_file >> y_size >> x_size; //y is longitude, x is latitude
    grid(x_size, y_size);
    int c;
    for (Grid<int>::iterator iter = grid.begin(); iter != grid.end(); ++iter)
    {
        c = SQS_file.get();
        if (c==10) c = SQS_file.get(); //ignore the endlines!!
        *iter = c-48; // It is necessary to subtract 48 when going from char to int (ascii value)
    }
    SQS_file.close();
}men MinGW har ikke lyst til at lade mig gøre dette.
Map.h:7: error: expected template-name before '<' token
Map.h:7: error: expected `{' before '<' token
Map.h:7: error: expected unqualified-id before '<' token
Map.h:7: error: expected `,' or `;' before '<' token
Map.cpp:9: error: invalid use of undefined type `class Map'
Map.h:7: error: forward declaration of `class Map'
 Er det umuligt, eller har jeg bare grebet det helt forkert an?
Jeg har stillet et spørgsmål til en tilsvarende problematik i en anden tråd: 
http://www.udvikleren.dk/C/Thread.aspx/1/22295/LastPage/
						
						
						
						
		
							Indlæg senest redigeret d. 11.10.2007 21:08 af Bruger #8249