2010-10-05 23 views
3

Je travaille sur un template de classe Array, qui accepte un autre template TRAITS en paramètre. Je voulais spécialiser l'opérateur [] de Array basé sur les Traits :: Struct, mais je suis coincé avec la syntaxe. Je ne suis pas sûr que ce soit possible.C++ fonction de membre spécialisation d'une classe qui a un template en paramètre

template <typename B> 
    typename Array<Traits<B, RuntimeDefined>>::Struct& 
    Array<Traits<B, RuntimeDefined>>::operator[](size_t a_index) 
    { 
     // Access proper member differently 
    } 

compilateur (g ++ 4.4) se plaint:

In file included from array.cpp:8: 
array.h:346: error: invalid use of incomplete type ‘class Array<Traits<N, RuntimeDefined> >’ 
array.h:26: error: declaration of ‘class Array<Traits<N, isig::RuntimeDefined> >’ 

EDIT.

La solution est basée sur la proposition de aaa et il ressemble à ceci:

 Struct& operator[](size_t i) 
     { 
      return OperatorAt(i, m_traits); 
     } 

     template <typename B, typename S> 
      inline Struct& OperatorAt(size_t i, const Traits<B, S>&) 
      { 
       // return element at i 
      } 

     template <typename B> 
      inline Struct& OperatorAt(size_t i, const Traits<B, RuntimeDefined>&) 
      { 
       // partial specialisation 
       // return element at in a different way 
      } 

Répondre

0

si je sais bien, il fallait se spécialiser classe. au lieu de le faire, je crée des fonctions spécialisées pour paramétrés classe particulière:

Par exemple:

Struct& operator[](size_t i) 
    { 
     return operator_(i, boost::type<TRAITS>()); 
    } 
private: 
    template<class B> 
    Struct& operator_(size_t i, boost::type<B>); // generic 
    Struct& operator_(size_t i, boost::type<A>); // specialized 

si vous avez besoin de contrôle plus fin, vous pouvez utiliser les fonctions libres, boost :: enable_if, boost :: mpl etc

+0

Merci beaucoup de fournir un point de vue différent sur la solution. – matejk