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 explicit specialization

kufa
kufa
Niveau 9
21 février 2006 à 05:52:59

J´ai pour vous une bonne question, du pur c++..
Donc voila je codais sur un code cross-platform, et desirais enlever un for(...) via une recursion sous template. Jusque la rien de tres complique, tout fonctionnait tres bien sous vs2005; mais boom, sous g++ mon terminator ne passait pas.
Voici le code en question, epure: http://rafb.net/paste/results/96TKXC12.html

Le probleme, viens du fait que je specialise une struct template contenue dans (deux) classes templates.
Premier reflexe, je place ma specialization en dehors de la classe, via un template<int dimension> template<class A> template<> (blablabla), mais pas mieux.
Deuxieme reflexe, google, pas mieux.
Troisieme, la norme, mais j ai rien trouve qui dit que ce n est pas possible de faire ca.

Donc ma question: existe-t´il un work around pour g++ (hors ne pas avoir une classe interne), ou mon code est hors norme et c´est juste vs qui le permet?

kufa
kufa
Niveau 9
21 février 2006 à 10:06:32

Pour ceux que ca interresse, c´est vs qui est non standard, les explicit template specialization sont interdites nested classes.
Comme les specializations partielles ne le sont pas
template< int I, typename T = void > struct recurse
et
template< typename T > struct recurse<dimension, T>
devrait faire l´affaire. Ca marche dans cet exemple, mais la tous les compilos ne trouvent pas mon terminator et loopent a l infini lorsque je remets ca dans le projet hehe

LGV
LGV
Niveau 28
21 février 2006 à 10:11:39

hmm interessant a savoir ! cela dit je ne vois pas bcp pourquoi cette forme de specialisation est interdite, elle ne me semble pas poser de pb specifique ou indetermine pour le compilo :-?

j´etais justement en train de faire qq tests avec mon compilo, mais bon, vu que c´est VC2005.. ca n´aide pas a savoir ce qui "standard" et ce qui ne l´est pas

kufa
kufa
Niveau 9
21 février 2006 à 11:02:51

iso 2003, 14.5.2.2: "a local class shall not have member templates".
Ce qui explique que seulement g++ n´accepte rien/compile rien, le seul a respecter la norme hehe

kufa
kufa
Niveau 9
21 février 2006 à 11:47:19

Toujours est-t´il, voila une version qui marche partout :)
http://rafb.net/paste/results/IWJUoq16.html

Faillait faire le terminator en 0 pour que ca marche..

dnob700
dnob700
Niveau 10
21 février 2006 à 18:50:03

n´empêche, tu peut désactiver les extensions non standard de VC++ et alors il devrait suivre aussi la norme probablement presque aussi bien que g++ (ce qui est pratique pour éviter ce genre de surprise).

kufa
kufa
Niveau 9
21 février 2006 à 19:08:12

Oui c´est vrai que c´est un reflexe que je n ai pas du tout.. mais bon au depart c´etait une erreur de ma part, j´etais sence savoir qu on ne pouvait pas faire cela.

LGV
LGV
Niveau 28
22 février 2006 à 10:00:33

sauf erreur de ma part, les extensions MS ne concernent que les extensions du langage (i.e. les __declspec, naked, etc.) ; je ne crois pas que le non-conformite a la norme soit modifiee lorsqu´on desactive ces extensions.
Si qq a 5mn a perdre pour confirmer ou infirmer..

kufa
kufa
Niveau 9
22 février 2006 à 17:59:11

De la msdn:

"The Visual C++ compiler offers a number of features beyond those specified in either the ANSI C or ANSI C++ standards. These features are known collectively as Microsoft extensions to C and C++. These extensions are available when the /Ze option, the default, is specified and are not available when the s option is specified"

La complete liste des changements est la:
http://msdn2.microsoft.coom/en-us/library/34h23df8.aspx

Cependant, mon truc n´est pas liste, et meme en desactivant les extensions, ca compile toujours sous vc2005 express...

dnob700
dnob700
Niveau 10
23 février 2006 à 00:00:06

dans ce cas là, ça peut arriver que g++ ne respecte pas entièrement la norme. Et que ce soit VC2005 qui ait raison non ?

kufa
kufa
Niveau 9
23 février 2006 à 01:30:24

Etant donne que j etais dans une local class de template class, aucun des deux compilo devait laisser passer ca de toute facon :)
Mais apres d autres tests et verifs, c est gcc qui a raison.

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