Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: invalid conversion from 'const int*' to 'int*'

Tags:

c++

gcc

I want to create a simple 3x3 matrix class and be able to access its contents by the subscript operator. Here's the code:

// Matrix.h
class Matrix {
private:
    int matrix[3][3];
public:
    int* operator[](const int index) const;
};

// Matrix.cpp
int* Matrix::operator[](const int index) const {
    return this->matrix[index];
}

I want to be able to access the elements of the array no matter whether the Matrix's object is const or non-const. But I get the following error from the compiler:

error: invalid conversion from 'const int*' to 'int*' [-fpermissive]

I did some research and I have a hypothesis: maybe, because I have declared this member function as a const function, inside its definition the compiler treats (it masks) all of the the object's non-mutable members as const members, so that would be the reason the compiler says it's an invalid conversion from 'const int*' to 'int*'. My question: Is this hypothesis correct? And if it's not, why does that happens? I think it makes sense and would be a great way of ensuring the const-ness of the 'const Matrix *this' object.

Compiler Info: gcc 5.3.0 downloaded from equation.com

like image 680
null Avatar asked Jan 07 '23 16:01

null


1 Answers

You are absolutely right about the reason why you get the error: inside a member function marked const the compiler implicitly treats all data members of the class as if they were declared with a const qualifier.

The fix is really straightforward - you can override the same operator twice, providing a const and a non-const versions:

class Matrix {
private:
    int matrix[3][3];
public:
    const int* operator[](const int index) const;
    int* operator[](const int index);
};

// Matrix.cpp
const int* Matrix::operator[](const int index) const {
    return this->matrix[index];
}
int* Matrix::operator[](const int index) {
    return this->matrix[index];
}

The compiler will figure out which overload to call based on the context. It will call const version if the Matrix itself is const, and the non-const version otherwise.

like image 175
Sergey Kalinichenko Avatar answered Jan 16 '23 20:01

Sergey Kalinichenko