所以我使用的是自定义矢量容器: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)
我需要一些关于如何解决这些问题的指导。
答案 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++?