>>231
こんなんじゃダメなの?(行数詰めたから見難いけど)
template <typename T> struct array_2d {
    T* data_; int size1_, size2_;
    array_2d(int size1, int size2) : data_(new T[size1 * size2]) , size1_(size1), size2_(size2){}
    ~array_2d() {delete[] data_;}
    struct proxy {
        array_2d* parent_; int offset_;
        proxy(array_2d* parent, int offset) : parent_(parent), offset_(offset) {}
        operator T*() {return parent_->data_ + offset_;}
    };
    proxy operator[](int x) {return proxy(this, size2_ * x);}
};
template <typename T> void assign(T& a) {
    for (int i = 0; i < 2; ++i) for (int j = 0; j < 3; ++j) a[i][j] = 10 * i + j;
}
#include <iostream>
int main() {
    array_2d<int> a(2, 3); assign(a);
    for (int i = 0; i < 6; ++i) std::cout << a.data_[i] << ' ';
    std::cout << std::endl;
    int b[2][3]; assign(b);
    for (int i = 0; i < 6; ++i) std::cout << reinterpret_cast<int*>(b)[i] << ' ';
    std::cout << std::endl;
    return 0;
}