c++ - 使用类模板创建动态数组时,将“const”作为“this”参数传递会丢弃限定符
问题描述
所以我创建了一个类模板,我在另一个类注册中使用它来创建一个 Result 类型的数组(这是另一个类),我正在尝试将一些信息读入其中。我现在收到错误消息REGIST.CPP|75|error: passing 'const Vector<Result>' as 'this' argument discards qualifiers [-fpermissive]|
。
我感到困惑的另一件事是,为什么错误说我的 Vector 是 const?
我不太确定问题是什么?下面是一些错误发生位置的示例代码,以及我的 Vector.h 类模板。
注册.h:
void Registration::writeFile(ostream & os) const{
os << "Student ID: " << GetStudentID() << '\n'
<< "Semester: " << GetSemester() << '\n';
for(unsigned i = 0; i < count; i++)
os << results[i] << '\n'; //error occurs at this line.
//note: Results was declared as private variable in the header file as Vector<Result> results;
}
矢量.h:
#ifndef VECTOR_H
#define VECTOR_H
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
template <class T>
class Vector
{
public:
Vector(int size = 10);
~Vector();
void initialize(int from);
void expand();
void push(const T &element);
int size(){return this->nrofel;}
T& operator[](int index);
private:
T **data;
int capacity;
int nrofel;
};
template <class T>
Vector<T>::Vector(int size){
this->capacity = size;
this->nrofel = 0;
this->data = new T*[this->capacity];
initialize(this->nrofel);
}
template <class T>
T& Vector<T>::operator[](int index){
if(index < 0 || index >= this->nrofel){
throw("Out of bounds.");
}
return *this->data[index];
}
template <class T>
void Vector<T>::initialize(int from){
for(size_t i = from; i < capacity; i++){
this->data[i] = nullptr;
}
}
template <class T>
Vector<T>::~Vector(){
for(size_t i = 0; i < capacity; i++){
delete this->data[i];
}
delete[]this->data;
}
template <class T>
void Vector<T>::expand(){
this->capacity *= 2;
T ** tempData = new T*[this->capacity];
for(size_t i = 0; i < this->nrofel; i++){
tempData[i] = this->data[i];
}
this->data = tempData;
initialize(this->nrofel);
}
template <class T>
void Vector<T>::push(const T& element){
if(this->nrofel >= this->capacity){
this->expand();
}
this->data[this->nrofel++] = new T(element);
}
#endif // VECTOR_H
我的向量类编译得很好,所以我希望那里没有问题,这是我尝试编译时似乎得到的唯一错误。
解决方案
你需要operator[]
为Vector
const-correct
T& operator[](int index);
const T& operator[](int index) const; //version for const Vector instances
两个重载的实现可能(并且可能应该)是相同的。您还应该检查其他函数的 const 正确性(目前,size()
绝对应该是const
)。
或者只是使用std::vector
,它已经完成了所有这些事情。
推荐阅读
- google-sheets - 在 Google 表格中的单元格中的 URL 中插入动态值
- css - 如何使用 CSS 简单地更改 wordpress 中字段标签的文本?
- windows - 需要帮助从 Windows 10 .BAT 文件运行嵌套程序调用而没有“不支持 UNC 路径”错误
- java - 如何使用多个填充段格式化 Java 字符串
- discord.js - discord.js v12 | TypeError:无法读取未定义的属性“发送”
- mongodb - 如何在 mongo 中使用 $addFields 将元素添加到现有文档?
- java - Spring Data JPA 附加 EntityManagerFactory 仅针对缓存和批量操作进行了优化
- python - 我有一个使用 OpenCV 的 python 脚本,代码在 python 2.7 中有效,但在 python 3.7 中无效,我不知道为什么
- c# - RDLC 报告表达式
- python - scrapy向Mysql插入数据