std::array<std::array<T, N2>、N> 数据成员上的括号运算符重载
Brackets operator overload on std::array<std::array<T, N2>, N> data member
因此,请考虑以下代码:
#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]
本身 returns 是一个 std::array<T, N2>
对象,因此再次将 operator[]
应用于该对象 (obj[2][2]
),应该会得到我需要的结果。所以实际上 obj[2]
是调用 foo
的 operator[]
,而 obj[2][2]
是调用 std::array<T, N>
的 operator[]
。明显不是。
问题:上面的例子是怎么回事,为什么我的逻辑有问题?
看看你的operator[]
。它 returns T&
,在你的情况下是 int&
。另一方面,data[index]
是 std::array<T, N2>&
类型,在本例中是 std::array<int, 3>&
.
更改运算符的 return 类型应该可以解决此问题:
std::array<T, N2>& operator[](std::size_t index) { return data[index]; }
operator[]
的return类型不对。表达式 data[index]
属于 std::array<T, N2>
类型,您告诉编译器您 return 一个 T&
,这是错误的。您的函数应如下所示:
std::array<T, N2>& operator[](std::size_t index) { return data[index]; }
因此,请考虑以下代码:
#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]
本身 returns 是一个 std::array<T, N2>
对象,因此再次将 operator[]
应用于该对象 (obj[2][2]
),应该会得到我需要的结果。所以实际上 obj[2]
是调用 foo
的 operator[]
,而 obj[2][2]
是调用 std::array<T, N>
的 operator[]
。明显不是。
问题:上面的例子是怎么回事,为什么我的逻辑有问题?
看看你的operator[]
。它 returns T&
,在你的情况下是 int&
。另一方面,data[index]
是 std::array<T, N2>&
类型,在本例中是 std::array<int, 3>&
.
更改运算符的 return 类型应该可以解决此问题:
std::array<T, N2>& operator[](std::size_t index) { return data[index]; }
operator[]
的return类型不对。表达式 data[index]
属于 std::array<T, N2>
类型,您告诉编译器您 return 一个 T&
,这是错误的。您的函数应如下所示:
std::array<T, N2>& operator[](std::size_t index) { return data[index]; }