2011-04-15 125 views
0


我是STL新手。我有如下如何繼承模板化的基類?

template <class T> 
class Base 
{ 
    public:  
    //Constructor and Destructor .. 
    Base(); 
    virtual ~Base(); 
    virtual foo() = 0; 
}; 

現在,我想我的設計框架,使得我的繼承類將從這個類公有派生,並在各自的實現都實現了富寫的模板基類。問題是我不知道如何從模板基類繼承? 難道如下...

template class<T> 
class Derived : public Base<T> 
{ 
    // Implementation of Derived constructor etc and methods ... 
}; 

或普通的C++方式

class Derived : public Base 
{ 
}; 

有什麼建議?此外,我將不勝感激爲入門STL對於像我這樣的新手任何信息......

問候,
阿圖爾

回答

5

後來,

class Derived : public Base 

的工作,因爲Base不是一個類,它是一個類模板。比這取決於Derived是否應該是一個模板,或者是否應該繼承的Base特定實例:

  • 模板:

    template<typename T> 
    class Derived : public Base<T> 
    
  • 非模板:

    class Derived : public Base<Something> 
    

    (其中Something是一些具體類型,如intchar *std::string

+0

感謝揚,我的派生類是模板類,以及。 – Atul 2011-04-15 10:00:32

+0

@Jane,它可以是第三種方式:'模板 類派生:公共基地' – iammilind 2011-04-15 10:24:58

1

要麼

template class<T> 
class Derived : public Base<T> 
{ }; 
如果你想 DerivedBase<>小號任何類型的工作

或者

class Derived : public Base<SomeSpecificType> 
{ }; 
如果你想 Derived僅與特定類型的 Base<>工作

+0

感謝,ildjarn,任何想法,我會得到更多和簡單的例子開始我遇到STL元編程? – Atul 2011-04-15 10:03:49

+0

@Atul:關於在線資源,[Comeau模板FAQ](http://www.comeaucomputing.com/techtalk/templates/)和[C++ FAQ Lite模板章節](http://www.parashift.com/ C++ - faq-lite/templates.html)是體面的。我真的不知道模板上有任何* light-reading *書籍,但是如果您想跳到深層,那麼就有[Modern C++ Design](http://www.amazon.com/dp/0201704315/)和[C++ Template Metaprogramming](http://www.amazon.com/dp/0321227255/)。 – ildjarn 2011-04-15 10:07:07

0

你的第二個例子是要走的路。

template class<T> 
public Base<T> 
{ // Implementation of Base constructor etc and methods ... 
}; 


template class<T> 
class Derived : public Base<T> 
{ // Implementation of Derived constructor etc and methods ... 
public: 
    Derived() : Base<T>() { } //have to construct the proper instanciation of Base 

}; 
0

除了上述的答案,也知道它可以在以下幾個方面也:

template<typename T> 
class Derived : public Base<Something> // Something is some concrete type 

template<typename T, typename U> 
class Derived : public Base<U>