标准::数组<std::array<T、N2>、N> 数据成员上的括号运算符重载

Brackets operator overload on std::array<std::array<T, N2>, N> data member

本文关键字:gt lt 重载 运算符 数据成员 array std 标准 N2 数组      更新时间:2023-10-16

因此,考虑以下代码:

#include <iostream>
#include <array>
template<class T, std::size_t N, std::size_t N2>
struct foo
{
    std::array<std::array<T, N2>, N> data;
    T& operator[](std::size_t index) { return data[index]; }
};
int main()
{
    foo<int, 3, 3> obj;
    std::cout << obj[2][2]; //boom
}

这是我的逻辑:obj[2]本身返回一个std::array<T, N2>对象,因此再次将operator[]应用于该对象(obj[2][2]),应该会得到我需要的结果。实际上,对于obj[2],它调用foooperator[],而对于obj[2][2],它调用的是std::array<T, N>operator[]。显然不是。

问题:上例中发生了什么,为什么我的逻辑有问题?

operator[]的返回类型不对。表达式data[index]的类型为std::array<T, N2>,并且您告诉编译器您返回了一个T&,这是false。你的功能应该是这样的:

std::array<T, N2>& operator[](std::size_t index) { return data[index]; }

查看您的operator[]。它返回T&,在您的情况下是int&。另一方面,data[index]是类型std::array<T, N2>&,在这种情况下是std::array<int, 3>&

更改操作员的返回类型应解决以下问题:

    std::array<T, N2>& operator[](std::size_t index) { return data[index]; }