2015-07-01 55 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