首页 > 解决方案 > 使用类模板创建动态数组时,将“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

我的向量类编译得很好,所以我希望那里没有问题,这是我尝试编译时似乎得到的唯一错误。

标签: c++arraystemplatesdynamic

解决方案


你需要operator[]Vector const-correct

T& operator[](int index);
const T& operator[](int index) const; //version for const Vector instances

两个重载的实现可能(并且可能应该)是相同的。您还应该检查其他函数的 const 正确性(目前,size()绝对应该是const)。

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


推荐阅读