所以我正在编写自己的矢量类,它很顺利,但我遇到了字符串类型的问题。整个类是模板,并且与std :: vector完全相同的东西,它适用于int,double,float,char,但是当涉及到std :: string时......它没有。即使是最简单的方法也会崩溃并抛出读取访问violtion。这是一些代码
标题文件的一部分
template <class T>
class MyVector{
std::unique_ptr<T[]> m_array;
int m_size;
int m_capacity;
};
构造
template <class T>
MyVector<T>::MyVector() : m_capacity(2), m_size(0) {
m_array = std::make_unique<T[]>(m_capacity);
}
ExtendArray方法
template <class T>
void MyVector<T>::extendArray() {
m_capacity *= 2;
std::unique_ptr<T[]> temp_array = std::move(m_array);
m_array = std::make_unique<T[]>(m_capacity);
std::copy(temp_array.get(), temp_array.get() + m_capacity / 2, m_array.get());
}
PushBack方法
template <class T>
void MyVector<T>::pushBack(const T& p_element) {
if (m_size == m_capacity) extendArray();
m_array[m_size] = p_element;
m_size++;
}
InsertAt方法,在给定索引处插入元素,然后移动数组的其余部分
template <class T>
void MyVector<T>::insertAt(int index, const T& p_element) {
if (m_size >= m_capacity - 1) extendArray();
if (m_array[index] == T{}) {
m_array[index] = p_element;
m_size++;
}
else {
std::copy(m_array.get() + index, m_array.get() + m_capacity, m_array.get() + index + 1);
m_array[index] = p_element;
m_size++;
}
}
问题1 PushBack方法工作正常,我不断添加所有类型的元素(包括字符串),它的确定。当我尝试使用insertAt方法
时会出现问题int main() {
MyVector<std::string> vec;
vec.pushBack("Ok here");
vec.pushBack("Extending array now");
vec.pushBack("Still no errors");
vec.insertAt(1, "Here comes the exception");
std::cin.get();
}
我得到了
MySTL.exe中的0x589750B9(vcruntime140d.dll)抛出异常: 0xC0000005:访问冲突写入位置0xB9B431B6。
如果我对char,int,float,double做同样的事情,一切正常。
问题2 我在Ubuntu上开始这个项目,用G ++编译它,我没有模板问题,现在我在Windows上工作,使用VS 2017社区,我需要添加
template class MyVector<std::string>;
template class MyVector<int>;
template class MyVector<float>;
我的.cpp中的等为了编译它,如果类型没有这样定义,它只是不编译...任何其他更好的解决方案?
问题3 在G ++上,我在向量中添加其他类没有任何问题,现在我无法做到这一点。即使我在.cpp中声明简单的类,例如
class Test {
int m_x;
public:
Test() {}
Test(int p_x) : m_x(p_x) {}
int getX() { return m_x; };
};
template class MyVector <Test>;
它不起作用,我得到了很多这样的编译器错误
错误C2676:二进制'==':'测试'没有定义此运算符或转换为预定义运算符可接受的类型
指向
if (m_array[index] == T{})
在G ++上,NULL或T {}都有效,现在它们都不起作用。