2010-04-29 179 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