Ik ben bezig met een mini implementatie van std::list, maar bots daarbij op een probleem bij het implementeren van een erase() functie die een iterator naar het volgende item teruggeeft (std::list gedrag dus). Iterator is een intern public struct, gedefinieerd in de list class zelf:
Als ik de erase functie implementeer in de class definitie zelf, is er geen probleem:
Als ik echter de code verhuis naar de source file:
krijg ik de volgende error:
Aan het template gebruik ligt het niet, want andere functies werken perfect. Meer nog, als ik erase() naar een void verander, compileert het geheel perfect! En toch is de syntax van de doorgegeven iterator identiek aan die van de return-type iterator
Wat nog grappiger is, ook in libstd++ hebben ze functies die een iterator teruggeven (zoals de erase functie) in de class definitie geimplementeerd... Is dit een C++ limitatie, of een foutje van mij? En in geval van het eerste, kan ik er rond werken?
Thanks,
maleadt
C++:
1
2
3
4
5
6
7
8
9
10
| // Iterator struct iterator { // Current location Node* ptr; // Default constructor (based on given node) iterator (Node* p = 0) : ptr(p) {} // En nog wat code } |
Als ik de erase functie implementeer in de class definitie zelf, is er geen probleem:
C++:
1
2
3
4
5
6
7
8
9
10
11
| template <typename T> iterator erase(iterator inputIterator) { // Iterator to next item iterator outputIterator; outputIterator.ptr = inputIterator.ptr->next; // Remove the data pop_specific(inputIterator.ptr); return outputIterator; } |
Als ik echter de code verhuis naar de source file:
C++:
1
2
3
4
5
6
7
8
9
10
11
| template <typename T> ustd::list<T>::iterator ustd::list<T>::erase(ustd::list<T>::iterator inputIterator) { // Iterator to next item iterator outputIterator; outputIterator.ptr = inputIterator.ptr->next; // Remove the data pop_specific(inputIterator.ptr); return outputIterator; } |
krijg ik de volgende error:
fout: expected constructor, destructor, or type conversion before 'ustd'
Aan het template gebruik ligt het niet, want andere functies werken perfect. Meer nog, als ik erase() naar een void verander, compileert het geheel perfect! En toch is de syntax van de doorgegeven iterator identiek aan die van de return-type iterator
Wat nog grappiger is, ook in libstd++ hebben ze functies die een iterator teruggeven (zoals de erase functie) in de class definitie geimplementeerd... Is dit een C++ limitatie, of een foutje van mij? En in geval van het eerste, kan ik er rond werken?
Thanks,
maleadt