C++ 通过';常数';as';这';参数在使用类模板创建动态数组时丢弃限定符

C++ 通过';常数';as';这';参数在使用类模板创建动态数组时丢弃限定符,c++,arrays,templates,dynamic,C++,Arrays,Templates,Dynamic,所以我已经创建了一个类模板,我在另一个类注册中使用它,来创建一个Result类型的数组(这是另一个类),我正在尝试将一些信息读入其中。我现在得到一个错误REGIST.CPP | 75 |错误:将“const Vector”作为“this”参数传递会丢弃限定符[-fppermissive]| 还有一件事我很困惑,为什么错误会说我的向量是常数 我不太确定问题出在哪里?下面是一些发生错误的示例代码,以及我的Vector.h类模板 注册.h: void Registration::writeFile(o

所以我已经创建了一个类模板,我在另一个类注册中使用它,来创建一个Result类型的数组(这是另一个类),我正在尝试将一些信息读入其中。我现在得到一个错误
REGIST.CPP | 75 |错误:将“const Vector”作为“this”参数传递会丢弃限定符[-fppermissive]|

还有一件事我很困惑,为什么错误会说我的向量是常数

我不太确定问题出在哪里?下面是一些发生错误的示例代码,以及我的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;


}
void注册::writeFile(ostream&os)常量{
奥斯·诺费尔){
投掷(“界外”);
}
返回*此->数据[索引];
}
模板
void Vector::初始化(int-from){
对于(大小=起始;i<容量;i++){
此->数据[i]=nullptr;
}
}
模板
向量::~Vector(){
对于(尺寸i=0;i数据[i];
}
删除[]此->数据;
}
模板
void Vector::expand(){
此->容量*=2;
T**tempData=新T*[此->容量];
对于(大小i=0;inrofel;i++){
tempData[i]=此->数据[i];
}
此->数据=临时数据;
初始化(此->nrofel);
}
模板
void Vector::push(常量T和元素){
如果(此->nrofel>=此->容量){
这个->扩展();
}
this->data[this->nrofel++]=新的T(元素);
}
#endif//VECTOR_H

我的vector类编译得很好,所以我希望没有问题,这是我尝试编译时遇到的唯一错误。

您的成员函数标记为
const
,因此所有数据成员都被认为是其中的
const

否则,
const
成员函数将能够修改它所属的对象

您应该添加一个
const
版本的
operator[]
,可以在这种情况下使用


size()

否则,
const
成员函数将能够修改它所属的对象

您应该添加一个
const
版本的
operator[]
,可以在这种情况下使用


size()

这两种重载的实现可能(也可能应该)是相同的。您还应该检查其他函数的常量正确性(目前,
size()
肯定应该是
const


或者只需使用
std::vector
,就可以完成所有这些操作。

您需要为
vector
生成
运算符[]

这两种重载的实现可能(也可能应该)是相同的。您还应该检查其他函数的常量正确性(目前,
size()
肯定应该是
const


或者只使用
std::vector
,它就完成了所有这些事情。

寄存器上有什么。CPP | 75 |编译器向您显示错误的地方?@永远它向我显示操作系统上的错误,然后查看答案,问题在于运算符[]。寄存器上有什么。CPP | 75 |编译器向您显示错误的地方?@永远它向我显示操作系统上的错误,然后查看答案,操作员[]中存在问题。这是我实验室工作练习的一部分,不允许我使用std::vector。谢谢你的建议,我现在添加了操作符的const重载,程序编译并运行,但是我收到消息“terminate called,在抛出一个“char const*”实例之后,程序终止。知道这意味着什么吗?@thedafferg异常被抛出而未被捕获。抱歉,没有标准库会抛出
const char*
,因此它必须由您的代码(或其他库)抛出。这是我实验室工作练习的一部分,我不允许使用std::vector。谢谢你的建议,我现在添加了操作符的const重载,程序编译并运行,但是我收到消息“terminate called,在抛出一个“char const*”实例之后,程序终止。知道这意味着什么吗?@thedafferg异常被抛出而未被捕获。好了,没有标准库会抛出
const char*
,所以它必须由您的代码(或其他库)抛出。谢谢您。它现在编译并运行良好,但是我在控制台中得到了一个错误,正如我在回答问题的注释中所描述的那样above@thedafferg这是一个单独的问题,您现在可以进行调试。该消息建议您抛出了
const char*
,但从未捕获到它,而且由于所有标准库异常都继承自
std::exception
,因此它必须是您的
抛出(“超出范围”)。所以,找出原因,谢谢你。它现在编译并运行良好,但是我在控制台中得到了一个错误,正如我在回答问题的注释中所描述的那样above@thedafferg这是一个单独的问题,您现在可以进行调试。该消息建议您抛出了
const char*
,但从未捕获到它,而且由于所有标准库异常都继承自
std::exception
,因此它必须是您的
抛出(“超出范围”)。所以,找出为什么会触发。
#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
T& operator[](int index);
const T& operator[](int index) const; //version for const Vector instances