2010-04-29 222 views
2

我該如何擴展模板類,例如向量?下面的代碼不起作用。編譯器抱怨'Vector'不是模板。擴展類模板

template <typename T> 
class Vector<T> : public std::vector<T> 
{ 
public: 
    void DoSomething() 
    { 
     // ... 
    } 
}; 
+6

你不應該從標準庫容器繼承。他們不是爲此而設計的。例如,他們沒有虛擬析構函數,所以如果你不小心,當你的派生向量被銷燬時,你的代碼將會中斷。 – jalf 2010-04-29 12:51:10

回答

19

你的語法錯了;你需要使用:

template <typename T> 
class Vector : public std::vector<T> 

這就是說,你不應該通過繼承來擴展標準庫中的容器,如果沒有其他原因,則是因爲他們沒有虛析構函數,因此它本質上是不安全的。

如果你想「提升」 std::vector,可能會使用成分(即與std::vector類的成員變量),或使用非成員函數提供您的附加功能。

+0

但是,如果您沒有虛擬成員,可以繼承STL容器嗎? – 2017-01-14 09:44:30

6

這與擴展另一個類無關。問題是您自己的派生類

你定義一個類模板是這樣的:

template <typename T> 
class Vector 
{ 
... 

,而不是

template <typename T> 
class Vector<T> 
{ 
... 
+0

jalfi是對的:class Vector 是Java語法,而不是C++語法。 – 2010-04-29 13:23:57

+0

這是專業化的語法,因此編譯器期望看到'Vector'的基本模板。 – UncleBens 2010-04-29 13:31:54