Partage
  • Partager sur Facebook
  • Partager sur Twitter

Spécialiser un fonction membre pour certains paramètres

Dans un aptron de classe

Sujet résolu
    30 mai 2008 à 21:28:29

    Bonjour,

    Je suis en train, pour m'entrainer : je sais que cette classe existe déjà, un patron de classe permettant de gérer des matrices.

    Voici la déclaration de la classe :
    template<typename Type, unsigned MATRIX_INTERNAL Lin, unsigned MATRIX_INTERNAL Col>
    class Matrix
    {
    	public:
    		// ...
    		Type det () const;
    		//...
    };
    


    La fonction "det" permettant de calculer le déterminant de la matrice, dans le cas d'une matrice carrée.


    Mon problème est que je souhaiterai spécialiser la fonction membre "det" pour le cas d'une matrice de type "Type" avec 1 ligne et 1 colonne.

    J'ai essayé le code suivant :
    template<typename Unit> Matrix<Unit, 1, 1>::det() const
    {
    	// ...
    }
    

    mais mon compilateur (MinGW) me dit :
    error: invalid use of undefined type `class Matrix_Environment::Matrix<Unit, 1u, 1u>'
    error: declaration of `class Matrix_Environment::Matrix<Unit, 1u, 1u>'
    error: template definition of non-template `Unit Matrix_Environment::Matrix<Unit, 1u, 1u>::det() const'


    J'ai essayé d'enlever le template et de remplacer les "Unit" par "int" : ça compile parfaitement. Mais j'aimerai que cette spécialisation soit effective pour n'importe quel "Type" et non pas seulement les "int".

    Que dois-je faire ?

    merci d'avance de vos réponses.
    Darkelfe
    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2008 à 4:26:26

      Il te suffit de faire :
      template <typename Type, unsinged MATRIX_INTERNAL Rang>
      Type Matrix<Type, Rang, Rang>::det()
      {
      // ta matrice est carrée, dans le cadre de cette spécialisation, c'est ok
      }
      

      Et de générer par exemple un BOOST_STATIC_ASSERT dans la version "non spécialisée" de det.
      • Partager sur Facebook
      • Partager sur Twitter
        31 mai 2008 à 13:01:30

        le problème est que je veux que ma spécialisation de det soit pour une matrice de dimension 1-1 et non pas seulement carré.

        Citation : Alp

        Et de générer par exemple un BOOST_STATIC_ASSERT dans la version "non spécialisée" de det.



        c'est quoi un "BOOST_STATIC_ASSERT"
        • Partager sur Facebook
        • Partager sur Twitter
          31 mai 2008 à 13:29:11

          Dans mes souvenirs, quand on spécialise une classe, on le fait pour toute la classe dans son ensemble.

          En faisant de det() une fonction libre plutôt ?
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            31 mai 2008 à 14:57:19

            je n'avais pas pensé à faire de det une fonction libre... je ne sais pas si ça va marcher.

            sinon, j'ai un livre sur C++. dedans ils disent que l'on peut spécialiser une fonction membre d'une classe (même si la classe est un patron de classe). Mais dans leurs exemples, il ne montre que dans le cas où Tout les paramètres sont spécialisés. Ils ne disent pas s'il est possible de n'en spécialiser une partie
            • Partager sur Facebook
            • Partager sur Twitter
              31 mai 2008 à 15:10:14

              Tu n'es pas obligé de déclarer la classe pour la nouvelle spécialisation partielle?

              Ton GCC (mingw n'est pas un compilo) est-il suffisamment récent pour supporter (à supposer que cela soit possible) ?

              Tu peux tenter le compilo en ligne de comeau quand tu cherches à savoir ce genre de choses.
              Sinon, ce n'est pas le genre de question que je poserai ici -- développez ou fclc++ me paraissent plus adaptés.
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                31 mai 2008 à 17:32:16

                Comme j'utilise Qt, j'ai la dernière version de MinGW (donc, a priori, celle de GCC aussi).
                • Partager sur Facebook
                • Partager sur Twitter
                  31 mai 2008 à 19:28:11

                  Pour spécialiser une classe modèle, il faut redéfinir toute la classe. La solution passe, comme l'a dit lmghs, par l'utilisation d'une fonction "externe" (rien à voir avec le mot-clé) à la classe, ou par la réécriture de toute la classe.

                  Le dernier MingW n'est pas la dernière version de GCC, il y a toujours un léger décalage.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    31 mai 2008 à 20:35:46

                    ok, merci à tous

                    apparament, avec une fonction "externe" ça marche. Mais je crois que je vais avoir besoin de redéfinir toute la classe.

                    merci à vous en tout cas
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Spécialiser un fonction membre pour certains paramètres

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown