2015-07-01 6 views
0

Я пытаюсь наследовать «производный» класс от base1 или base2. Для этой цели я хочу использовать специализированную специализацию. У меня есть следующиеНаследование одного из двух базовых классов с использованием специализированной специализации и конструктора

//base1 
template<typename FT> 
class base1 
{ 
public: 
base1(FT m) 
{} 
}; 

//base2 
template<typename FT> 
class base2 
{ 
    public: 
    base2(FT m) 
    {} 
}; 

//define template specializations 
template<int sType, typename FT> 
class baseT {}; 

//for base1 
template<typename FT> 
class baseT<1,FT> 
{ 
    public: 
    typedef base1<FT> bType; 
}; 

//for base2 
template<typename FT> 
class baseT<2,FT> 
{ 
    public: 
    typedef base2<FT> bType; 
}; 

//Derived class which inherits either from base1 or base2 
template<int sType, typename FT> 
class derived : public baseT<sType,FT>::bType 
{ 
    public: 
    derived(FT m) 
    {} 
}; 

int main() 
{ 
    derived<1,float> a1(1); 

    return 0; 
} 

Этот код не компиляции (на платформе Linux), так как базовый класс ожидает один аргумент, но я не знаю, как передать его в конструктор, полученный, чтобы сделать эту работу. (Я не хочу использовать условный). Любые советы помогут

+0

Я не думаю, что проблема заключается в коде, который вы опубликовали. Я только что скомпилировал, не связал, образец кода, который вы опубликовали, и все работало должным образом. –

ответ

0
//Derived class which inherits either from base1 or base2 
template<int sType, typename FT> 
class derived : public baseT<sType,FT>::bType 
{ 
    public: 
    derived(FT m) : baseT<sType,FT>::bType(m) 
    {} 
}; 

Это все, что вам нужно для его работы. Инициализировать базовый класс.

+0

Благодарим за решение. У меня есть другой вопрос: что, если base1 и base2 имеют различное количество аргументов конструктора, например: base2 (FT n1, FT n2) {} является конструктором. Может ли производный класс по-прежнему ссылаться на конструктор base1 или base2? –

+0

Очевидно, что шаблон не будет соответствовать ни одному, ни другому базовому классу. Вы видите, что вы должны использовать специальные аргументы для конструкторов с осторожностью! Часто лучше сделать аргументы конструктора опционными. Например, вы можете заменить конструктор на функцию init и вызвать это внутри производной функции конструктора. – ikrabbe