CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] template et redefinition de type

godrik
godrik
Niveau 30
28 octobre 2010 à 02:48:54

Bonjour a vous,
aujourd'hui je fais joujou avec le type priority_queue de la lib pb_ds ( http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/ ). la priority_queue defini un type local du nom de point_iterator (desole si je n'utilise pas le bon nom, je ne connais pas le vocabulaire pour ces operations).

J'ai dans mon code, une fonction template qui prends une priority_queue comme parametre et qui l'abstrati sous le type Cntnr.

Le code suivant ne compile pas (avec g++ (Debian 4.3.2-1.1) 4.3.2
) pour un probleme de typage que je ne comprends pas

Cntnr::point_iterator foo[42];

alors que celui ci compile:

typedef typename Cntnr::point_iterator FOO;

FOO foo[42];

Avez vous une idee de ce qui se passe ? Je risque de faire ce genre de templatisation assez frequement, donc si vous avez une explication ou un pointeur (no pun intended) vers un document qui explique ca clairement, ca m'interesse.

Merci!

sleepything
sleepything
Niveau 1
28 octobre 2010 à 17:04:58

Salut,

Tu n'aurais pas simplement oublié "typename" (type dépendant d'un paramètre template) dans ta 1ère version non compilable ? Ou alors c'est un mauvais copier/coller ?

Seb

godrik
godrik
Niveau 30
29 octobre 2010 à 00:00:37

J'ai ecrit exactement ca: "Cntnr::point_iterator foo[42];". Je m'attendais a ce que ca marche parceque Cntnr est un type et que point_iterator est defini pour un Cntnr.

sleepything
sleepything
Niveau 1
29 octobre 2010 à 01:08:42

Toi tu le sais que point_iterator est un type, mais il faut le dire au compilo : typename ! D'ailleurs tu l'as utilisé dans le 2ème exemple, voilà pourquoi je ne comprenais pas.

typename Cntnr::point_iterator foo[42];

http://cpp.developpez.com/faq/cpp/?page=templates#TEMPLATES_typename

godrik
godrik
Niveau 30
29 octobre 2010 à 01:42:49

Je comprends un peu mieux a la lecture de ton lien.

j'ai l'habitude d'ecrire "std::vector<int>::iterator", je ne voyais pas la difference avec "Cntnr::point_iterator". (D'ailleurs, je ne suis toujours pas bien sur de le comprendre. Mais bon le standard l'impose.)

kufa
kufa
Niveau 9
29 octobre 2010 à 04:52:38

Le standard n'impose pas l'utilisation de typename (ou template) pour rien, et ca peut se reveler bien utile de savoir pourquoi! Je t'ai fait un petit example, j'espere que ca t'aidera a comprendre ton probleme: http://pastebin.com/GgC3tcxP

Ca serait interessant de voir ta class Cntnr cela dit, mais il te manque probablement un typedef pour les iterator, ou alors tu utilise Cntnr dans une templated classe/method, dans lequel cas tu dois utiliser typename.

godrik
godrik
Niveau 30
29 octobre 2010 à 18:49:01

Cntnr est le nom template pour une priority queue de pb_ds en l'occurence:

http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/priority_queue.html

(je regarde ton example)

godrik
godrik
Niveau 30
29 octobre 2010 à 19:00:41

mmm, je comprends mieux maintenant.
Est ce que la lecture de "Effective STL" m'aiderait a comprendre ces problemes la en details ?

kufa
kufa
Niveau 9
31 octobre 2010 à 00:46:45

Cool que m'on exemple ait pu t'eclairer un peu!
Hmm ca fait des annees que j'ai pas lu un book "Effective" (STL/C++), je peux malheureusement pas te donner mon avis a froid sur ce topic la en particulier.

Je pense que ces "problemes", ou plutot ces aspects la de la norme, ne s'apprennent que the hard-way, a savoir en passant par la case "hmm pourquoi ca compile pas ce truc?" et par une (re-)lecture de la norme. Vi au debut c'est chiant, mais on s'y retrouve vite et on comprends mieux apres - et non je suis pas un extremiste :P

Il faut dire que BCP de programmeurs pros et aguerris que je connais se laissent facilement avoir par ces missing template ou typename, parfois il faut plus reflechir a ce que le compilo pourrait comprendre plutot que "mais pourquoi il trouve pas ca tout seul?"; de plus, les vieilles versions du compilos de visual se permettaient de faire des choix qui allaient dans le sens "commun des programmeurs", mais a l'encontre de la norme..

chris_27
chris_27
Niveau 10
31 octobre 2010 à 11:52:05

sleepything : désolé, mais je n'ai pas été convaincu par l'argument « le compilo ne sait pas que c'est un type » à propos du standard qui impose l'utilisation de typename. J'ai pourtant lu ce que tu as pointé (plus des choses autour que j'ai trouvé très intéressantes d'ailleurs :content: ), mais rien n'y fait.

J'ai vraiment l'impression que c'est juste une règle pour éviter que les compilateurs fassent du caca. :(

sleepything
sleepything
Niveau 1
31 octobre 2010 à 17:40:36

Ce qu'il faut comprendre là, c'est que le standard impose que le code "templatisé" soit valide avant même l'instanciation.
Plus d'infos :
http://www.developpez.net/forums/d913125/c-cpp/cpp/signification-typename/

Ensuite, çà coûte pas gd chose te mettre le mot "typename" dans chacun de ces cas ;p

chris_27
chris_27
Niveau 10
31 octobre 2010 à 17:44:32

Bah… Moi, j'avoue, j'en abuse du "typename" tellement je pige pas quand il faut le mettre ou non. :rouge:

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment