2010-08-10 7 views
3

Je n'arrive pas à comprendre comment spécialiser partiellement ce modèle. compilateur se plaint que le paramètre de modèle N est pas utilisé dans la spécialisation partielleSpécialisation partielle du modèle C++

#include <boost/multi_array.hpp> 

template<typename T, class A> 
struct adaptable; 

template<typename T, size_t N> 
struct adaptable<T, 
       // line below is the problem 
       typename boost::multi_array<T,N>::template array_view<2>::type> 
{ 
    typedef typename boost::multi_array<T,N>::template array_view<2>::type type; 
}; 

Je peux ajouter le paramètre de modèle factice juste pour faire taire le compilateur.

template<typename T, class A, class A0 = A> 
struct adaptable; 

template<typename T, size_t N> 
struct adaptable<T, 
       typename boost::multi_array<T,N>::template array_view<2>::type, 
       boost::multi_array<T,N> > 
{ 
    typedef typename boost::multi_array<T,N>::template array_view<2>::type type; 
}; 

est-il plus simple?

+0

Je ne peux même pas dire ce que vous essayez d'accomplir avec votre spécialisation partielle. À quoi ressemble la version non spécialisée de 'struct adaptable'? – Omnifarious

+0

@Onm Je mets une déclaration non spécialisée – Anycorn

+0

Je ne suis pas certain, mais il pourrait y avoir des problèmes provenant du fait que dans le template de base pour 'adaptable', le 2ème paramètre de template est un type, alors que dans votre spécialisation, c'est une intégrale constant. Ma conjecture est que pour cette raison, la 2ème déclaration n'est pas réellement une spécialisation (partielle ou autre) du 1er, et devrait probablement être marquée par le compilateur comme une erreur. –

Répondre

3

Je ne vois rien dans votre exemple qui ressemble à une spécialisation partielle. Une spécialisation partielle est une spécialisation qui spécifie des types exacts pour certains si les paramètres du modèle de base, mais laisse les autres ouverts. Par exemple:

template <class T, class U> 
struct my_template {  
    // the base template where both T and U are generic 
}; 

template <class T> 
struct my_template<int> { 
    // A partial specialization where T is still generic, but U == int 
}; 

Pour soutenir la spécialisation partielle, le modèle de base doit avoir au moins deux paramètres de modèle (voir le numéro N). Le modèle partiellement spécialisé peut avoir des paramètres de modèle 1.N-1. La spécialisation partielle doit être située à l'endroit où le compilateur aura déjà "vu" le modèle de base avant de tenter de compiler la spécialisation partielle. La spécialisation partielle est écrite comme un modèle complètement séparé du modèle de base (bien que le modèle de base et toutes les spécialisations doivent avoir le même nom, bien sûr).

+0

quel est le nom de ce modèle class my_template > ' – Anycorn

+0

@aaa: C'est juste un modèle de classe qui utilise une spécialisation d'un autre modèle de classe. –

+0

@j_r y a-t-il un nom propre? – Anycorn

Questions connexes