[C++] Return nested struct

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • maleadt
  • Registratie: Januari 2006
  • Laatst online: 15-09 20:25
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:
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

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Ik denk dat je er "typename" voor moet zetten. dus template <typename T> typename ustd::list<T>::iterator etc

Acties:
  • 0 Henk 'm!

  • maleadt
  • Registratie: Januari 2006
  • Laatst online: 15-09 20:25
Juiste correctie binnen de 10 minuten, dat moet een record zijn :) Bedankt, ik moet me blijkbaar eens inlezen wat betreft de finesses van het template systeem.

Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Dat komt omdat list<T> gespecialiseerd kan zijn op basis van het template argument T, en de member ::iterator kan dan van alles zijn, ook een constante/enum, dus je compiler ziet dat niet. Met het typename keyword geef je aan dat het om een type gaat.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:27

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens, je bent op de hoogte van het feit dat zonder het 'export' keyword, dat maar weinig compilers daadwerkelijk supporten, alle sourcefiles die gebruik maken van je list op de hoogte moeten zijn van de implementatie, en je dus niet zomaar de implementatie naar een sourcefile kunt verhuizen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • maleadt
  • Registratie: Januari 2006
  • Laatst online: 15-09 20:25
@Zoijar
Thanks, ik begrijp nu waarom het nodig is.

@.oisyn
Ben ik inderdaad tegengekomen. Aangezien de source enkel voor mijn eigen projectjes gebruikt zal worden vond ik het mooier om de implementatie toch af te splitsen en een template_instantiations te gebruiken. Naar de export functionaliteit heb ik nog niet echt gekeken, buiten idd dat maar weinig compilers het ondersteunen.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
maleadt schreef op woensdag 06 mei 2009 @ 20:13:
@.oisyn
Ben ik inderdaad tegengekomen. Aangezien de source enkel voor mijn eigen projectjes gebruikt zal worden vond ik het mooier om de implementatie toch af te splitsen en een template_instantiations te gebruiken. Naar de export functionaliteit heb ik nog niet echt gekeken, buiten idd dat maar weinig compilers het ondersteunen.
Als ik het goed heb, is een vaak gebruikte "oplossing" om onder aan je .h file je .cpp file te includen. Dan heb je toch je interface/implementatie nog soort van gescheiden gehouden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1