C ++: приведение объекта к массиву - PullRequest
0 голосов
/ 21 марта 2012

Я пишу матричный класс и хочу иметь возможность привести матрицу фиксированного размера к двойному массиву фиксированного размера.Хотя у меня проблемы с реализацией соответствующего оператора приведения.То, что я реализовал до сих пор, не работает:

template<unsigned int M, unsigned int N>
class Matrix
{
    typedef double (&ArrayType)[M][N];
public:
     operator ArrayType();
}


Matrix<3,3> mat1;
double matArr[3][3];
matArr =  mat1;

ошибка: несовместимые типы при назначении 'sfz :: Matrix <3u, 3u>' для 'double [3] [3]'

Приведение матрицы явно вызывает другую ошибку:

ошибка: ISO C ++ запрещает приведение к типу массива' double [3] [3] '

Нет ли способа реализовать синтаксис, которого я хочу достичь?

1 Ответ

6 голосов
/ 21 марта 2012

Вы не можете назначать массивы, никогда.Живите с этим.

Чтобы ваша функция работала, вы могли бы сделать ссылку :

double (&ar)[3][3] = mat1;

В качестве альтернативы, вы могли бы обернуть вашу голуюмассив в чем-то вроде std::array<std::array<double, M>, N> и возвращают , что по значению.Вот почему существуют обертки типа std::array - они позволяют обрабатывать массивы как значения.Тот же трюк работал в C с самого первого дня (помещение массива в структуру), но на самом деле это хорошо и читабельно в C ++:

typedef typename std::array<std::array<T, M>, N> type;
operator type() const { return internal_array; }
...