自定义矢量不支持unique_ptr

时间:2016-10-03 20:53:51

标签: c++ c++11 vector unique-ptr

所以我使用的是自定义矢量容器:https://github.com/patr0nus/Vector/blob/master/Vector.h

我正在尝试创建一个指向自定义Class对象的unique_ptr向量。

以前失败了:

  

错误:类型为'std :: __ 1 :: unique_ptr的对象   的std :: __ 1 :: default_delete>”不能分配,因为它   复制赋值运算符被隐式删除

我通过将以下代码添加到vector.h来修复它:

void push_back(T&& val)
    {
        resize(m_size + 1);
        m_container[m_size - 1] = std::move(val);
    }

现在问题是,我无法迭代此向量而其他函数如swap失败:

no matching function for call to 'swap'
        swap(*__x4, *__x5);
candidate template ignored: could not match 'tuple' against 'unique_ptr'
swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u)

我需要一些关于如何解决这些问题的指导。

3 个答案:

答案 0 :(得分:5)

您不能将patr0nus/Vector与非POD类型一起使用。原因很简单:它在许多地方使用memcpy,并要求类型为复制构造。

将其与任何非POD的其他内容一起使用实际上是未定义的行为。不要将该矢量用于非POD类型。没有办法解决它。

您可能知道,您可以使用一个定义明确的实现来满足一组精确的需求,并且可能比该矢量实现更优化:std::vector

如果您有一些内存或分配限制,您可以实现自定义分配器。

答案 1 :(得分:1)

要添加给出的答案,由于您的矢量类仅适用于POD类型,因此您可以确保仅使用POD类型的方法是使用std::is_pod函数和static_assert 。使用这些C ++工具将禁止创建违反​​POD要求的程序。

构造向量时,可以在这些函数中进行测试:

#include <algorithm>
//...
template<typename T>
class Vector
{
   Vector(int initialSize = 1)
   {
      static_assert(std::is_pod<T>(), "Sorry, only POD types are allowed");
     //...
   }

    Vector(const Vector &source)
    {
      static_assert(std::is_pod<T>(), "Sorry, only POD types are allowed");
      //...
    }
    //...
};

这确保了如果有人做这样的事情:

Vector<std::string> sV;

编译器错误将显示而不是代码编译并导致您现在看到的问题。

答案 2 :(得分:0)

在resize()函数中你有:

{
...
            m_capacity = size * 2;//The new capacity is double of the size.
            T* oldPtr = m_container;
            m_container = (T*)malloc(m_capacity * sizeof(T));//Allocate the new container.
            memcpy(m_container, oldPtr, m_size * sizeof(T));//Copy the elements.
            destory(oldPtr, m_size);//Destory the old container.
            free(oldPtr);
...
}

所以你需要将POD(普通旧数据)元素放到你的矢量中:
What are POD types in C++?