IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

[Template] Template et boucle for


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut [Template] Template et boucle for
    Bonjour à tous,

    J'ai besoin de vos lumières . Je dispose d'une fonction template que j'utilise dans la boucle suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    template <std::size_t SIZE>
    bool AABB<SIZE>::Intersection (const RayPacket<SIZE> & rayPacket_) const
    {
    	Packet<SIZE, float> nearDist (0.0f);
    	Packet<SIZE, float> farDist (std::numeric_limits<float>::infinity());
     
    	for (i = 0 ; i != 3 ; ++i)
    	{
    		const Packet<SIZE, float> & org = rayPacket_.origin.GetPacket<i>();
    		const Packet<SIZE, float> & invDir = rayPacket_.invDirection.GetPacket<i>();
     
    		Packet<SIZE, float> t0 = (min.GetPacket<i>() - org) * invDir;
    		Packet<SIZE, float> t1 = (max.GetPacket<i>() - org) * invDir;
     
    		nearDist = Max (nearDist, Min (t0, t1));
    		farDist = Min (farDist, Max (t0, t1));
    	}
     
    	return (nearDist[0] < farDist[0]);
    }
    Toutefois, lorsque je tente de compiler ce code, j'obtiens l'erreur suivante :

    error C2975: 'SIZE2' : invalid template argument for 'Vec3f<SIZE>::GetPacket', expected compile-time constant expression
    Dans ce cas ce n'est pas très compliqué, je n'ai qu'à itérer 3 fois et donc je peux facilement dérouler la boucle, mais pour autant, je ne comprends pas pourquoi le compilateur gueule. J'aurais compris sur la condition avait été une variable, mais ici c'est une constante (le 3). Pourquoi le compilateur ne peut-il pas automatiquement "dérouler" la fonction pour moi, étant donné qu'il connait à la compilation le nombre de fois qu'il va itérer...

    Merci :p

  2. #2
    Membre très actif

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Par défaut
    Bonjour,

    Je pense simplement qu'il faut supprimer les <i> dans : rayPacket_.origin.GetPacket<i>();

    Didier

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Hein ? Mais si je supprime les <i> il peut pas savoir quel packet accéder !

  4. #4
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Ça ne peut pas fonctionner, i n'est pas une constante !
    Il faut que tu déportes le contenu de la boucle dans une autre fonction qui prend un int en argument template, et que tu appelles explicitement cette fonction 3 fois.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    D'accord. J'ai plus vite fait de dérouler la boucle directement, surtout que ça n'aurait aucun sens de la déporter dans une autre fonction. Je penserai à cette solution si jamais j'ai des tailles plus élevées. Merci

Discussions similaires

  1. [XSLT 1.0] Boucle for each ou template méthode
    Par kacedda dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/08/2014, 16h17
  2. Problème avec template template template
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2012, 14h40
  3. [Metaprogramation]Boucle for template (très) générique
    Par méphistopheles dans le forum Langage
    Réponses: 25
    Dernier message: 20/07/2010, 10h52
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo