因此,请考虑以下代码:
#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]
正在调用foo
的{{1}},而operator[]
正在调用obj[2][2]
的{{1}}。显然不是。
问题:上面的示例中发生了什么,为什么我的逻辑有问题?
答案 0 :(得分:2)
operator[]
的返回类型不对。表达式data[index]
的类型为std::array<T, N2>
,您告诉编译器返回T&
,这是假的。你的功能应如下所示:
std::array<T, N2>& operator[](std::size_t index) { return data[index]; }
答案 1 :(得分:1)
看看你的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]; }