括号运算符重载std :: array <std :: array <t,n2 =“”>,N&gt;数据成员

时间:2015-12-07 19:13:08

标签: c++ arrays c++11 operator-overloading

因此,请考虑以下代码:

#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}}。显然不是。

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

2 个答案:

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