2010-10-05 4 views
3

Я работаю над шаблоном класса Array, который принимает в качестве параметра другой шаблон TRAITS.Специализация функции C++ для класса с шаблоном в качестве параметра

template <typename BASE, typename STRUCT> 
    class Traits { 
    public: 
     typedef BASE BaseType; 
     typedef STRUCT Struct; 
     // .. More here 
    }; 

template <class TRAITS> 
    class Array { 
    public: 
     typedef TRAITS       Traits; 
     typedef typename Traits::BaseType  BaseType; 
     typedef typename Traits::Struct   Struct; 

     Struct& operator[](size_t i) 
     { 
      // access proper member 
     } 
     // More here... 
    }; 

Я хотел специализироваться оператор [] из массива на основе Черты :: Struct, однако я застрял с синтаксисом. Я не уверен, что это вообще возможно.

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

Компилятор (G ++ 4.4) жалуется:

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.

Решение основано на предложении ааа и это выглядит следующим образом:

 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 
      } 

ответ

0

, если я правильно знаю, вы должны были специализироваться весь класс. вместо того, чтобы делать это, я создаю специализированные функции параметрироваться для конкретного класса:

Например:

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 

, если вам нужно более детализированный контроль, вы можете использовать бесплатные функции, повысить :: enable_if, повышающего :: mpl и т. д.

+0

Большое спасибо за предоставление другой точки зрения на решение. – matejk

Смежные вопросы