Problème template template [RESOLU]

Problème template template [RESOLU] - C++ - Programmation

Marsh Posté le 06-04-2008 à 00:48:43    

Bonjour,
 
j'ai un problème de compilation sous gcc avec le code suivant:
 

Code :
  1. template < uint8_t IDXS, typename S, template <class> class CSS,
  2.            uint8_t IDXD, typename D, template <class> class CSD >
  3. struct quantifier {
  4.    inline static D scale(const S* src) {
  5.       const D minD = CSD<D>::minValue(IDXD);
  6.       const D delD = CSD<D>::maxValue(IDXD) - minD;
  7.       const S delS = CSS<S>::maxValue(IDXS) - CSS<S>::minValue(IDXS);
  8.       return D(minD + src[IDXS] * delD / delS);
  9.    }
  10. };
  11. template < typename T >
  12. struct RGB {
  13.    static inline uint8_t countSamples() { return 3; }
  14.    static inline T minValue(uint8_t sample) { return 0; }
  15.    static inline T maxValue(uint8_t sample) { return 1; }
  16.    template < typename U >
  17.    static inline void fromRGB(T* dest, const U* src) {
  18.       dest[0] = quantifier<0,U,RGB,0,T,RGB>::scale(src);
  19.       dest[1] = quantifier<1,U,RGB,1,T,RGB>::scale(src);
  20.       dest[2] = quantifier<2,U,RGB,2,T,RGB>::scale(src);
  21.    }
  22.    template < typename U >
  23.    static inline void toRGB(T* dest, const U* src) {
  24.       fromRGB<U>(dest, src);
  25.    }
  26. };


 
Pour les lignes 20 à 22, le message est:
 

Code :
  1. error: type/value mismatch at argument 3 in template parameter list for `template<unsigned char IDXS, class S, template<class> class CSS, unsigned char IDXD, class D, template<class> class CSD> struct quantifier'
  2. error:   expected a class template, got `RGB<T>'
  3. error: type/value mismatch at argument 6 in template parameter list for `template<unsigned char IDXS, class S, template<class> class CSS, unsigned char IDXD, class D, template<class> class CSD> struct quantifier'
  4. error:   expected a class template, got `RGB<T>'
  5. error: `scale' is not a member of `<declaration error>'


 
D'après le message, je suppose que le fait d'être à l'interieur de la classe RGB est interpreté comme RGB<T> et donc le paramètre passé a scale n'est plus un template.
 
Quelle est la syntaxe a employer pour passer RGB et pas RGB<T> ?


Message édité par chicotruss le 07-04-2008 à 19:43:21
Reply

Marsh Posté le 06-04-2008 à 00:48:43   

Reply

Marsh Posté le 06-04-2008 à 20:25:27    

sort le code de la classe, tout en le laissant inline.
 

Code :
  1. template < uint8_t IDXS, typename S, template <class> class CSS,
  2.            uint8_t IDXD, typename D, template <class> class CSD >
  3. struct quantifier {
  4.    inline static D scale(const S* src) {
  5.       const D minD = CSD<D>::minValue(IDXD);
  6.       const D delD = CSD<D>::maxValue(IDXD) - minD;
  7.       const S delS = CSS<S>::maxValue(IDXS) - CSS<S>::minValue(IDXS);
  8.       return D(minD + src[IDXS] * delD / delS);
  9.    }
  10. };
  11. template < typename T >
  12. struct RGB {
  13.    static inline uint8_t countSamples() { return 3; }
  14.    static inline T minValue(uint8_t sample) { return 0; }
  15.    static inline T maxValue(uint8_t sample) { return 1; }
  16.    template < typename U >
  17.    static void fromRGB(T* dest, const U* src);
  18.    template < typename U >
  19.    static inline void toRGB(T* dest, const U* src) {
  20.       fromRGB<U>(dest, src);
  21.    }
  22. };
  23. template< typename T >
  24. template< typename U >
  25. inline void RGB< T >::fromRGB(T* dest, const U* src)
  26. {
  27.       dest[0] = quantifier<0,U,RGB,0,T,RGB>::scale(src);
  28.       dest[1] = quantifier<1,U,RGB,1,T,RGB>::scale(src);
  29.       dest[2] = quantifier<2,U,RGB,2,T,RGB>::scale(src);
  30. }


 
edit :
finalement je ne suis pas sûr que ce soit suffisant pour ton problème :D
et si tu mettais template devant RGB ?


Message édité par jesus_christ le 06-04-2008 à 20:29:50
Reply

Marsh Posté le 07-04-2008 à 10:47:46    

Sûr que tu as besoin de :

Code :
  1. template < uint8_t IDXS, typename S, template <class> class CSS,
  2.             uint8_t IDXD, typename D, template <class> class CSD >


Genre tu pourrais définir:

Code :
  1. template < uint8_t IDXS, typename S, class CSS,
  2.             uint8_t IDXD, typename D, class CSD >


et utiliser dans ta struct RGB:

Code :
  1. dest[0] = quantifier<0,U,RGB<U>,0,T,RGB<T> >::scale(src);


ou si tu es dans la struct:

Code :
  1. dest[0] = quantifier<0,U,RGB<U>,0,T,RGB>::scale(src);

Reply

Marsh Posté le 07-04-2008 à 19:42:46    

Merci pour vos idées.
 
J'ai essayé de sortir le code de ma classe et avec template (j'ai éssayé aussi typename et template typename) mais ça n'a pas fonctionné.
Pour la solution d'ElDesdichado, j'y avais pensé mais je prefèrait l'eviter pour garantir que CSS soit bien CSS<S>.
 
Au final, je viens de résoudre mon problème en qualifiant RGB depuis la portée globale:
 

Code :
  1. dest[0] = quantifier<0,U,::RGB,0,T,::RGB>::scale(src);

Reply

Marsh Posté le 07-04-2008 à 20:00:44    

chicotruss a écrit :

Merci pour vos idées.
J'ai essayé de sortir le code de ma classe et avec template (j'ai éssayé aussi typename et template typename) mais ça n'a pas fonctionné.


 
tu aurais pu t'en sortir avec un petit coup de MPL_HAS_TRAITS_DEF

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed