2015-12-07 54 views
0

所以,考慮下面的代碼:支架上的std ::數組運算符過載<性病::陣列<T, N2>,N>數據成員

#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[]。很明顯不是。

問題:在上面的例子中發生了什麼,爲什麼我的邏輯有問題?

+3

你'操作符[]'被聲明爲返回一個'T&'但隨後嘗試返回'的std ::陣列&'。 – ildjarn

回答

2

operator[]的返回類型是不正確的。表達式data[index]的類型爲std::array<T, N2>,並且您告訴編譯器,您返回的是錯誤的T&。你的函數應該是這樣的:

std::array<T, N2>& operator[](std::size_t index) { return data[index]; } 
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]; } 
相關問題