Toon posts:

[C++] STL-perikelen

Pagina: 1
Acties:

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
11
// declaratie juist voor de functie waarin "landen" (zie onder) gedefinieerd word.
#define LAND_ROUTES  std::map <unsigned long, routendb_record, kleinste_van_2_ulongs>
#define LAND_ELEMENT std::pair<short,LAND_ROUTES>
#define ALLE_LANDEN  std::map <char*, LAND_ELEMENT, kleinste_van_2_strings>

// declaratie in header-file
struct kleinste_van_2_strings   { bool operator()(const char *s1, const char *s2) const { return ( strcmp(s1, s2) < 0 ); } };
struct kleinste_van_2_ulongs    { bool operator()(const unsigned long s1, const unsigned long s2) const { return ( s1 < s2 ); } };

// Declaratie in een obscure functie
  ALLE_LANDEN           landen;


Nu het rare is dat dit fouten geeft ;).

code:
1
2
3
4
5
\RoutenTab.cpp(23) : error C2977: 'pair' : too many template arguments
        c:\program files\coding\microsoft visual studio\vc98\include\utility(27) : see declaration of 'pair'
\RoutenTab.cpp(23) : error C2146: syntax error : missing ',' before identifier 'landen'
\RoutenTab.cpp(23) : error C2065: 'landen' : undeclared identifier
\RoutenTab.cpp(23) : error C2143: syntax error : missing '>' before ';'


Verder wat ik ook enorm vreemd is als ik hetvolgende doe:
C++:
1
#define LAND_ELEMENT std::pair<short,int>

of
C++:
1
#define LAND_ELEMENT LAND_ROUTES


Dat dit perfect compileerd. (ik maak me voorlopig nog niet druk over het al dan niet runnen van de code, ik wil eerst compilen ;))

Kan er iemand mij mijn fout aanduiden? Daar volgens mij alles logisch in elkaar zit :S

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

mag ik vragen waarom jij daar in hemelsnaam defines voor gebruikt, en niet gewoon typedef :?

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.


Verwijderd

Topicstarter
Zou dat verschil maken ;)

derect es testen... En daar had je ofc wel gelijk in, typedef toont schoner

**edit**
ok, funky shit!

Waarom werkt dat met typedefs wel & niet met defines? (lengte van define te groot geworden ofzo?)

[ Voor 39% gewijzigd door Verwijderd op 12-01-2004 23:17 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ga jij eens snel je C++ manual doorlezen, met name het stukje over de preprocessor (defines/macro's), en typedefs

Defines zorgen alleen maar voor lexicografische substitutie. Een typedef wordt echter door je compiler gezien als een echt type, waardoor het typesafe is, en rekening wordt gehouden met namespaces

Bovendien kun je met defines lang niet alle types definieren. Maak jij maar eens een define voor een functiepointer

[ Voor 16% gewijzigd door .oisyn op 12-01-2004 23:21 ]

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

De echte error is overigens dat jouw code er na preprocessor parsing zo uit ziet:
C++:
1
2
3
// Declaratie in een obscure functie 
std::map <char*, std::pair<short,std::map 
    <unsigned long, routendb_record, kleinste_van_2_ulongs>>, kleinste_van_2_strings> landen;

Door de token substitution komt daar aan het einde van de std::pair argument >> te staan, wat niet mag. Bij template template arguments dient er altijd whitespace tussen de >'s te staan, omdat >> reeds de streaming/bitshift operator is.

Verder moet je gewoon typedefs pakken maar dat was al gezegd ;)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

[nohtml]Overigens even waarom het fout gaat, zoals ik al zei zijn defines gewoon een lexicographische substitutie.

C++:
1
2
#define LAND_ROUTES  std::map <unsigned long, routendb_record, kleinste_van_2_ulongs> 
#define LAND_ELEMENT std::pair<short,LAND_ROUTES>


LAND_ROUTES wordt in deze vervangen door std::map
Het resultaat is dan:

C++:
1
#define LAND_ELEMENT std::pair<short,std::map <unsigned long, routendb_record, kleinste_van_2_ulongs>>


Die >> op het eind gaat natuurlijk nogal fout, aangezien dat een shift right is, en geen groter dan.

.edit: wheehehe, GMTA :P

[ Voor 3% gewijzigd door .oisyn op 13-01-2004 01:24 ]

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.


Verwijderd

Topicstarter
Aaaaah :)

Owkee!!!


BTW typedef werkt perfect ;) dus ik denk dat ik dat wat meer ga gebruiken... Is enorm handig dingetje (zelfde als define dus, maar veel beter daar ge het "type" zelf maakt zoals .oisyn al vermeld had :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

zelfde als define dus
nee, typedef is niet hetzelfde als define, het is echt 100% compleet anders. Een define komt niet eens bij de compiler, dat wordt door de preprocessor textueel vervangen. Met een typedef maak je een alias voor een bepaald type in de huidige namespace. Daarom kun je dit doen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
class Blaat
{
public:
    typedef int my_int;

    my_int i;
};

int main ()
{
    my_int i = 3;   // error, my_int is niet gedefinieerd in de huidige namespace
    Blaat::my_int j = 3;   // ok, Blaat heeft een type dat my_int heet
}


En niet te vergeten gewoon zoiets:

C++:
1
2
3
typedef int array_of_int[8];

array_of_int a = { 1, 2, 3, 4, 5, 6, 7, 8 };

[ Voor 12% gewijzigd door .oisyn op 14-01-2004 01:04 ]

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 14 januari 2004 @ 00:31:
BTW typedef werkt perfect ;) dus ik denk dat ik dat wat meer ga gebruiken... Is enorm handig dingetje (zelfde als define dus, maar veel beter daar ge het "type" zelf maakt zoals .oisyn al vermeld had :)
Misschien een idee om Stroustrup eens te kopen als je vindt dat typedef en define hetzelfde zijn ;)

Professionele website nodig?

Pagina: 1