[C++/STL] iterator icm templates

Pagina: 1
Acties:

  • JeromeB
  • Registratie: September 2003
  • Laatst online: 29-12-2025
Ik wil een vector-iterator combineren met een template:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
#include <iterator>

template<typename T>
void functie(T blah)
{
    std::vector<T> vec; // waarom werkt dit wel
    std::vector<T>::iterator it; // ,maar dit niet
}

int main()
{
    return 0;
}


Mijn compiler (GCC) geeft de volgende error:
code:
1
2
3
       | In function `void functie(T)':
line 8 | expected `;' before "it"
       | [Build Error]  [main.o] Error 1
(Test Drive Comeau C++ Online gaf een vergelijkbare error.)

Waarom werkt dit niet?

Ik las dat een compiler niet kan bepalen of T een type is of iets anders, maar dat begrijp ik niet. En waarom werkt het dan alsnog niet wanneer ik er een typedef voorvoeg?:
C++:
1
2
typedef T td;
std::vector<td>::iterator it;

PC load letter? What the fuck does that mean?


  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 16-02 15:05
ik gok dat je typename nodig zal hebben, dus
code:
1
typename std::vector<T>::iterator it


edit: bij die online compiler geeft hij als je typename gebruik alleen nog maar een warning, geen error :)

[ Voor 37% gewijzigd door truegrit op 04-06-2006 00:52 ]

hallo


  • JeromeB
  • Registratie: September 2003
  • Laatst online: 29-12-2025
truegrit schreef op zondag 04 juni 2006 @ 00:48:
ik gok dat je typename nodig zal hebben, dus
code:
1
typename std::vector<T>::iterator it
Klopt, ik kwam er toevallig net achter via een artikel, maar toch bedankt. :o

Verder blijven mijn vragen wel staan. Ik begrijp namenlijk nog steeds niet wat het probleem is voor de compilers.

edit:
MSalters en truegrit, bedankt voor de uitleg.

[ Voor 8% gewijzigd door JeromeB op 05-06-2006 12:31 ]

PC load letter? What the fuck does that mean?


  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 16-02 15:05
Ik denk omdat de compiler niet kan zien wat voor type het is, omdat het een template functie is.
een quote uit The C++ programming language (van stroustrup):
Having to add typename before the names of member types of a template parameter is a nuisance. However, the compiler isn't psychic. There is no general way for it to know wether a member of a template argument type is a typename
En de meeste compilers behandelen het standaard als iets wat niet verwijst naar een type of een template, dus dan moet je dat expliciet aangeven.

Denk ik dan, misschien dat iemand anders er meer over kan vertellen :)

hallo


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Alle correcte compilers behandelen het als iets wat verwijst naar een member variabele. Het probleem zit'm in two-phase name lookup; op het moment dat functie gecompileerd wordt weet je nog niet wat T is, en dus zou er een specialisatie kunnen zijn van std::vector die zelfs geen iterator heeft! Om compilers enigzins efficient te laten zijn mogen ze aannemen dat iterator geen typename is of template is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein