【问题标题】:Extending class template扩展类模板
【发布时间】:2010-04-29 12:48:48
【问题描述】:

如何扩展模板类,例如矢量?下面的代码不起作用。编译器抱怨“向量”不是模板。

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

【问题讨论】:

  • 您不应该从标准库容器继承。它们不是为此而设计的。例如,它们没有虚拟析构函数,所以如果你不小心,当你的派生向量被销毁时,你的代码就会中断。

标签: c++ inheritance templates


【解决方案1】:

你的语法错误;你需要使用:

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

也就是说,你不应该通过继承来扩展标准库容器,如果没有其他原因,那么因为它们没有虚拟析构函数,因此它本质上是不安全的。

如果您想“增强”std::vector,请使用组合(即使用 std::vector 类型的成员变量)或使用非成员函数来提供附加功能。

【讨论】:

  • 但是如果没有虚拟成员,可以从 STL Containers 继承吗?
【解决方案2】:

这与扩展另一个类无关。问题是你自己的派生类。

你这样定义一个类模板:

template <typename T>
class Vector
{
...

而不是

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

【讨论】:

  • jalfi 是对的:类 Vector 是 Java 语法,而不是 C++ 语法。
  • 这是专门化的语法,因此编译器希望看到Vector 的基本模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多