你如何使用vector作为基类

时间:2014-10-30 14:26:31

标签: c++ templates inheritance c++11

Win7的 Cygwin的

这是我第一次使用模板&容器。我不明白这些错误。以我(天真)的方式查看事物,我定义了一个分配器(_Alloc)和一个typdef(allocator_Type)。这些消息似乎在说我没有正确完成我的作业。我不知道该怎么做。

代码是:

template<typename T, typename _Alloc = std::allocator<T>>
class Array : public vector<T, _Alloc> {
   public:
      typedef T         value_type;
      typedef _Alloc    allocator_Type;
   private:
   int compar (const void* p1, const void* p2) { T v1 = (T)*p1;
                                                 T v2 = (T)*p2;
                                                 return (v1 < v2)? -1: (v1 > v2)? 1: 0;   }
   public:
   explicit Array (const allocator_Type& alloc = allocator_type()) : vector<T, _Alloc>(alloc)    { };
   explicit Array (size_t n)                                       : vector<T, _Alloc>(n)        { };
            Array (size_t n, const T& val,
                    const allocator_type& alloc = allocator_type()): vector<T, _Alloc>(n, val, alloc) { };
};

错误消息是:

main.cpp:31:27: error: 'allocator_type' does not name a type
                     const allocator_type& alloc = allocator_type()): vector<T, _Alloc>(n, val, alloc) { };
                           ^
main.cpp:31:27: note: (perhaps 'typename std::vector<_Tp, _Alloc>::allocator_type' was intended)
main.cpp:31:66: warning: ISO C++ forbids declaration of 'alloc' with no type [-fpermissive]
                     const allocator_type& alloc = allocator_type()): vector<T, _Alloc>(n, val, alloc) { };
                                                                  ^
main.cpp:28:65: warning: there are no arguments to 'allocator_type' that depend on a template parameter, so a declaration of 'allocator_type' must be available [-fpermissive]
    explicit Array (const allocator_Type& alloc = allocator_type()) : vector<T, _Alloc>(alloc)    { };
                                                                 ^
main.cpp:31:66: warning: there are no arguments to 'allocator_type' that depend on a template parameter, so a declaration of 'allocator_type' must be available [-fpermissive]
                     const allocator_type& alloc = allocator_type()): vector<T, _Alloc>(n, val, alloc) { };
                                                                  ^

2 个答案:

答案 0 :(得分:1)

这已在评论中说明,但尚未作为答案发布:您不

标准库容器不应该用作(公共)基类。它们是非多态的,因此您无法将从一个派生的对象安全地传递给任何需要指针或对容器的引用的函数。

理论上,您可以使用标准容器作为私有基类。它具有与私有成员变量相同的语义,但如果您只使用私有成员变量,它将使您的代码更容易被其他人使用。

答案 1 :(得分:0)

首先 - 你有一个拼写错误:allocator_Type中的大写T和const allocator_Type中的小写&amp; alloc = allocator_type()。第二个 - std :: vector析构函数不是虚拟的,因此你真的不应该从它派生,除非你从不通过基类强制转换和删除。