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