2013-04-08 5 views
1

следующая ситуация:C++ Template Специализация с Inheritance

class FeatureBase 
class Feature1 : public FeatureBase 

class FeatureAttrBase 
class Feature1Attr : public FeatureAttrbase 

FeatureBase содержит список FeatureAttrBase и должны иметь возможность создавать и управлять этими объектами. Поэтому я использую шаблон в FeatureBase.

template<class T = FeatureAttrBase> class FeatureBase 

создания и управления атрибутами (например, новый T())

и подклассы используют специализированный удел

class Feature1 : public FeatureBase<Feature1Attr> 

нигде в моем коде я написал метод

RegisterFeature(FeatureBase<FeatureAttrBase>* feature) 

, но компилятор дает мне ошибку, что он не смог преобразовать между Feature1 и FeatureBase. В указанном методе мне нужно использовать информацию только из FeatureAttrBase. Но внутри Feature1 мне нужен доступ к Feature1Attr.

Таким образом, вопрос заключается в том, как решить эту проблему? Нужно ли мне менять свою структуру данных?

+0

Итак, в чем вопрос? –

+2

'Feature1' и' FeatureBase 'не принадлежат к одной и той же иерархии, они не связаны между собой классами. – jrok

+0

есть возможность изменить иерархию (шаблон, наследование) для использования классов указанным способом? – kaelumania

ответ

1

Наличие параметров шаблона, наследуемых друг от друга, не создает связанных классов шаблонов. Вы должны вместо этого сделать что-то вроде следующего (не может быть лучшим решением, но вы не указали, что вы пытаетесь сделать):

class FeatureAttrBase; 
class FeatureBase 
{ 
public: 
    virtual FeatureAttrBase* GetAttributes() = 0; 
}; 

template<class T> 
class FeatureImpl : public FeatureBase 
{ 
    T attr; 
public: 
    FeatureAttrBase* GetAttributes() 
    { 
     return &attr; 
    } 
}; 

class Feature1Attr : public FeatureAttrBase; 
class Feature1 : public FeatureImpl<Feature1Attr>; 

На самом деле, вы, вероятно, не нужно FeatureImpl класс и может поместите реализацию непосредственно в класс Feature1 (и полностью избавитесь от шаблонов).

+0

Хорошо. Это моя спецификация: у меня есть несколько функций, каждый из которых имеет список атрибутов, связанных с некоторыми объектами в среде. Все атрибуты имеют общую базу (FeatureAttbase). Таким образом, специальные атрибуты (Feature1Attr) могут быть обновлены внутри Feature. Но также более общий алгоритм работает по всем функциям и читает общие значения для вычисления общего результата. – kaelumania

+0

В чем причина разделения функций и FeatureAttr? В любом случае, мое решение должно быть в порядке, и вы можете избавиться от класса «FeatureImpl», поскольку он ничего не делает - просто сохраните 'Feature1Attr' внутри' Feature1' и верните его указатель в 'GetAttributes'. – riv

0

Вы можете наследовать специализации FeatureBase от FeatureBase<FeatureAttrBase>. Что-то вроде этого:

// Forward declaration 
template <typename T> 
class FeatureBase; 

// Type selecting trait class FeatureBase_BaseClass 
// FeatureBase for derived Attrs will inherit from FeatureBase<FeatureAttrBase> 
template <typename T> 
struct FeatureBase_BaseClass 
{ 
    typedef FeatureBase<FeatureAttrBase> Type; 
}; 

// FeatureBase<FeatureAttrBase> will inherit from a dummy type 
template <> 
struct FeatureBase_BaseClass<FeatureAttrBase> 
{ 
    struct Type {}; 
}; 



// Use FeatureBase_BaseClass to select the proper base class for FeatureBase 
template <typename T = FeatureAttrBase> 
class FeatureBase : public FeatureBase_BaseClass<T>::Type 
{ 
    //as before 
}; 

Таким образом, все FeatureBase<X> для конкретных атрибутов X унаследует от FeatureBase<FeatureAttrBase>.

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