C++ 运算符重载 [] 和返回类型

Hen*_*old 1 c++ class operator-overloading square-bracket

我刚刚重新审视 C++,我有一个关于 [] 运算符重载的问题,更具体地说,为什么我的程序不起作用。

在 vec.cpp 中给出以下代码:

double Vec::operator[](unsigned int i) const {
    return this->values[i];
}

double & Vec::operator[](unsigned int i) {
    return this->values[i];
}
Run Code Online (Sandbox Code Playgroud)

这些在 vec.h 中定义为 Vec 类的方法,如果我不在 main.cpp 中使用该运算符,一切都很好。它可以正常编译,没有错误。

但是,一旦我在主函数中执行此操作(使用 std::cout 和 std::endl):

cout << a[0] << endl;
Run Code Online (Sandbox Code Playgroud)

事情出了问题。我得到的错误是一堆

candidate function template not viable: no known conversion from 'Vec' to 'char' for 2nd argument
operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
Run Code Online (Sandbox Code Playgroud)

您可以在其中将“char”替换为任何原始数据类型。

这是一个工作示例

cout << a[0] << endl;
Run Code Online (Sandbox Code Playgroud)
candidate function template not viable: no known conversion from 'Vec' to 'char' for 2nd argument
operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn)
Run Code Online (Sandbox Code Playgroud)
// In main.cpp
#include <iostream>
#include <string>

#include "vec.h"

using std::cout, std::endl;

int main() {
    double avals[2];
    avals[0] = 1.0;
    avals[1] = 2.0;
    Vec *a = new Vec(2, avals);

    cout << a[0] << endl; // Error occurs here

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决这个问题吗?

Vla*_*cow 5

在这份声明中

Vec *a = new Vec(2, avals);
Run Code Online (Sandbox Code Playgroud)

声明了一个类型为 的指针Vec *。因此,带有解引用指针的表达式的类型为Vec

所以在这个声明中

cout << a[0] << endl;
Run Code Online (Sandbox Code Playgroud)

表达式的a[0]类型为Vec

看来你的意思是

( *a )[0]
Run Code Online (Sandbox Code Playgroud)

或者

a[0][0]
Run Code Online (Sandbox Code Playgroud)

  • 或者可能是“Vec a(2, avals);”,在这种情况下“a[0]”是正确的。这里没有明显的动态分配原因。 (3认同)