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

C++ Discussion :

Template et fonctions


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Universit� de Technologie de Compi�gne
    Inscrit en
    Mai 2011
    Messages
    15
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Universit� de Technologie de Compi�gne

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par d�faut Template et fonctions
    Bonsoir,

    Je suis en train de faire un wrapper d'une biblioth�que dans le cadre d'un projet, cependant je me heurte � un petit soucis avec les templates. Je ne sais pas vraiment caract�riser ce probl�me par des mots, je vais donc d'abord montrer le code source de ce que j'ai fais.

    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
    21
    22
    23
    24
    25
    26
    27
     
      /** vec
       * \brief Mathematics vectors.
       */
      template <unsigned int Dim, typename T>
      struct vec;
     
      template <typename T>
      struct vec<2, T>
      {
        typedef glm::detail::tvec2<T> value;
        typedef glm::detail::tvec2<T> const& const_ref;
      };
     
      template <typename T>
      struct vec<3, T>
      {
        typedef glm::detail::tvec3<T> value;
        typedef glm::detail::tvec3<T> const& const_ref;
      };
     
      template <typename T>
      struct vec<4, T>
      {
        typedef glm::detail::tvec4<T> value;
        typedef glm::detail::tvec4<T> const& const_ref;
      };
    Voici donc la d�finition de ma classe vector en utilisant la biblioth�que GLM. Maintenant, toujours dans le but de m'�viter de r�-�crire les fonctions, j'ai voulu �crire un wrapper pour la fonction cross product. Cela donne donc:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      /** Compute the cross product between two vectors.
       * \param left Left vector.
       * \param right Right vector.
       * \return Cross product between left and right.
       */
      template <unsigned int Dim, typename T>
      typename vec<Dim, T>::value
      cross_product( typename vec<Dim, T>::const_ref left
                   , typename vec<Dim, T>::const_ref right)
      {
        return glm::cross(left, right);
      }
    Maintenant pour plus de facilit� j'ai fais quelque typedefs:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
      // 3d vector typedefs.
      typedef vec<3, double>::value vec3d;
      typedef vec<3, float>::value  vec3f;
    Et donc, l'utilisation qui ne fonctionne pas:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
      vec3f v0 = vec3f(1.f, 0.f, 0.f);
      vec3f v1 = vec3f(0.f, 1.f, 0.f);
     
      vec3f res = cross_product(v0, v1);
    L'erreur �tant, je trouve, assez obscure puisque je ne vois pas vraiment o� le compilateur veut en venir car pour moi les types sont �quivalents:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    Programming/Project/wind/src/demo/main.cxx: In function ‘int main()’:
    Programming/Project/wind/src/demo/main.cxx:37:35: error: no matching function for call to ‘cross_product(wind::math::vec3f&, wind::math::vec3f&)’
    Programming/Project/wind/src/demo/main.cxx:37:35: note: candidate is:
    Programming/Project/wind/include/wind/math/vector.txx:30:55: note: template<unsigned int Dim, class T> typename wind::math::vec::value wind::math::cross_product(typename wind::math::vec<Dim, T>::const_ref, typename wind::math::vec<Dim, T>::const_ref)
    Je pense que l'erreur doit �tre stupide, mais l� j'avoue ne vraiment pas voir.
    Est-ce quelqu'un pourrait me donner un petit coup de main ?

    Merci d'avance! :-)

  2. #2

  3. #3
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Par d�faut
    Bonjour,
    il veut faire un wrapper sans avoir � recoder le cross product etc...
    (qui d'ailleurs est suspect dans le lien : remplacement de produit par des soustractions)

    Pour le probl�me de Kiwei je ne vois pas trop, rien ne me choque. Il va falloir attendre des yeux plus avis�s.

  4. #4
    Membre averti
    Homme Profil pro
    Universit� de Technologie de Compi�gne
    Inscrit en
    Mai 2011
    Messages
    15
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activit� : Universit� de Technologie de Compi�gne

    Informations forums :
    Inscription : Mai 2011
    Messages : 15
    Par d�faut
    Salut,

    Merci beaucoup, l'erreur �tait en effet assez triviale.
    Encore merci pour le temps que tu as accord� � me r�pondre!

    Par contre, ce qui m'emb�te c'est qu'il faut sp�cifier les arguments templates de la fonction. Or, j'esp�rais (� tord j'avoue) que le compilateur aurait d�termin� seul ces derniers. Bon je me rend bien compte au final que c'est en effet pas possible en l'�tat. mais est-ce que vous auriez une solution �l�gante ?

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Je n'ai pas de solution �l�gante, j'ai juste chang� des choses au hasard jusqu'� ce que �a marche
    Et du coup il a fallu refaire un cross-product (oups, faux en plus) pour simuler glm.
    EDIT: une autre solution serait de faire tes propres small vectors puis de sp�cialiser vec pour convertir implicitement vers les type glm + un constructeur implicite � partir d'un type glm). Enfin, facile � dire.

  6. #6
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    28
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Par d�faut
    Essai de sp�cifier ton appel � cross_product :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vec3f res = cross_product<3,float>(v0, v1);
    Chez moi �a marche, mais je ne comprend pas pourquoi il ne trouve pas tout seul.


    Edit :

    Sinon il y a cette solution :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //changement de ton cross product
    template <typename VecType>
    VecType
    cross_product( const VecType& left
    			  ,const VecType& right)
    {
        return glm::cross(left, right);
    }
    et plus loin

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vec3f res = cross_product(v0, v1);
    l� il comprend tout seul.

  7. #7
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Bonsoir,

    Le probl�me est que le compilateur ne peut pas d�duire les arguments templates si ceux si sont dans un nom qualifi� (ie A<T>::B -> T ne peut pas �tre d�duit). Mets toi � la place du compilateur, si l'argument est A<T> et que l'objet est de type (statique) A<int> alors l'identification du type T est direct (T = int), si maintenant l'argument est A<T>::B, et que l'objet est de type A_IMPL<T>, comment je fais ? Ce n'est pas impossible, mais ce n'est plus une simple identification (il faudrait passer tout les types d�finient � cette instant dans l'unit� de traduction jusqu'� ce que A<T>::B = A_IMPL<T> et en esp�rant qu'il n'y ai pas de collision ! (*) ). Le C++ ne permet pas ce genre de "d�duction".

    Je trouve �trange que ton produit vectoriel travail avec la classe repr�sentant les d�tails d'impl�mentations, autrement dit ce que tu voulais enrober. Pourquoi ne pas prendre en argument un Vect<Dim,T> et laisser le soin � Vect<Dim,T> d'avoir un sous-objet qui repr�sente les d�tails d'impl�mentation ?

    Sinon sous certaines conditions (� chaque classe repr�sentant l'impl�mentation on peut associer une unique classe d'enrobage), on peut r�aliser une classe de traits qui a chaque classe repr�sentant les d�tails d'impl�mentation associe la classe d'enrobage. Et ensuite utiliser une fonction de produit vectoriel interm�diaire qui prend en argument un const T& et qui appele la seconde fonction de produit vectorielle en sp�cifiant les param�tres templates grace � la classe de trait. (**)

    (*) Et potentiellement d'autres probl�mes auquels je ne pense pas.
    (**) Je ne suis pas convaicu de l'apport d'une telle solution. Dans les deux cas on a un indirection (pour acc�der au sous-objet dans le premier cas et l'utilisation d'une fonction interm�diaire dans l'autre), et personnelement je pr�f�re la premi�re solution.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 54
    Dernier message: 18/04/2010, 12h51
  2. R�ponses: 3
    Dernier message: 09/04/2009, 11h30
  3. Template de fonction
    Par vanitom dans le forum Langage
    R�ponses: 9
    Dernier message: 22/08/2008, 15h42
  4. Utilisation de template de fonctions
    Par mister3957 dans le forum Langage
    R�ponses: 4
    Dernier message: 02/07/2008, 19h07
  5. R�ponses: 2
    Dernier message: 27/01/2008, 21h22

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