当前位置: 首页 > 知识库问答 >
问题:

错误:从“const int*”到“int*”的转换无效

姚雅珺
2023-03-14

我想创建一个简单的3x3矩阵类,并能够通过下标操作符访问其内容。代码如下:

// 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];
}

我希望能够访问数组的元素,无论矩阵的对象是常量还是非常量。但我从编译器中得到以下错误:

错误:从“const int*”到“int*”的转换无效[-fpermissive]

我做了一些研究,我有一个假设:也许,因为我已经将这个成员函数声明为const函数,在它的定义中,编译器将对象的所有不可变成员视为const成员(它掩盖了),所以这就是编译器说它是从“const int*”到“int*”的无效转换的原因。我的问题:这个假设正确吗?如果不是,为什么会发生这种情况?我认为这是有意义的,并且将是确保“const Matrix*this”对象的常量的好方法。

编译器信息:gcc 5.3.0从公式下载。com公司

共有3个答案

洪鸿
2023-03-14
int* Matrix::operator[](const int index) const {
    return this->matrix[index]; }

这里您可以说,您不需要通过将函数指定为const来修改对象的状态。

但您正在返回一个指向实例变量的指针,通过该指针可以更改类的实例变量的值(从而更改状态)。

因此,您可以创建该运算符的非常量版本以避免该问题。

房新翰
2023-03-14

当您声明一个类方法(运算符是类方法)时,这意味着您只能在类的字段上调用const方法,并且只能返回指向类字段的指针或引用。为了进行编译,您需要下定决心:

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

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

或者两者兼而有之。

和斌
2023-03-14

关于出现错误的原因,您完全正确:在标记为const的成员函数中,编译器会隐式处理类的所有数据成员,就像它们是用const限定符声明的一样。

修复非常简单-您可以覆盖同一个操作符两次,提供常量和非常量版本:

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];
}

编译器将根据上下文确定要调用哪个重载。如果矩阵本身是常量,则调用常量版本,否则调用非常量版本。

 类似资料:
  • 之前,我已经实施了此功能,并且它起到了作用: 我甚至可以用下面的东西检查我是否得到了正确的尺寸,一切都很好。 但是,在使用以下初始化尝试整个程序时,我得到了一个编译错误: 以下是错误消息: rbm. cpp:在函数“ululemexFunction(int, mxArray**, int, const mxArray**)”中:rbm. cpp: 570:64: error:从“int”到“int

  • 我一直在尝试编译,并玩了一圈的和数,但仍然不能弄清楚错误是什么。有什么想法吗? 标题:

  • “你好,世界” 这是我在网站上的第一篇帖子,也是我在第五周学习java编程课程的第一篇文章。我应该提一下,我还是一个初学者。我本周的任务如下: “创建一个(双精度)数组来存储下面的分数。然后使用上述方法之一创建排序类。确保排序类处理双精度数组(双精度[] 数组名称;)。创建一个客户端类来调用排序类。将数组从最小到最大排序,然后打印出已排序的数组。 到目前为止,我所做的工作是创建第一个用于收集和打印

  • 我使用< code>typedef unsigned int value_t定义了一个类型;和一个函数 编译器拒绝编译它,说:无效的转换从'int(*)()(true)'到'value_t{aka int}'。 这是什么意思?查看numeric_limits类,< code>min()函数应该返回一个通过template typename传递给它的类型的变量,在本例中是< code>value_t

  • 我想将浮点值转换为int值或抛出异常,如果这种转换是不准确的。 我找到了以下建议:使用来转换,然后使用来检查这些值是否相等。如果它们相等,那么转换是精确的,否则就不是。 但是我发现了一个不起作用的例子。下面是演示这个例子的代码: 它输出: 我知道2147483648不适合整数范围,但我很惊讶为这些值返回true。有没有更好的方法来比较float和int?我想可以将这两个值都转换为字符串,但对于这样