Я довольно новичок в С++ с Boost.
Я хочу, чтобы объект класса «мир» имел массив с именем «кусок» типа «октринода». Раньше у меня был обычный одномерный массив, и это работало нормально. Теперь я пытаюсь перейти к использованию трехмерного массива с функциональностью multi_array Boost, и я действительно не уверен, что делаю неправильно.
Упрощенный код:
class world {
public:
typedef boost::multi_array<octreenode, 3> planetchunkarray; // a boost_multi for chunks
typedef planetchunkarray::index index;
planetchunkarray *chunk;
world(double x,double y,double z,
int widtheast, int widthnorth, int height) :
originx(x), originy(y), originz(z),
chunkseast(widtheast), chunksnorth(widthnorth), chunksup(height) {
chunk = new planetchunkarray(boost::extents[chunksnorth][chunkseast][chunksup]);
planetchunkarray::extent_gen extents;
for (int cz = 0; cz < chunksnorth; ++cz) {
for (int cx = 0; cx < chunkseast; ++cx) {
for (int cy = 0; cy < chunksup; ++cy) {
(*chunk)[cz][cx][cy] = new octreenode(1,72);
}
}
}
}
};
После чего, если я попытаюсь выполнить задание
корень->планета[0]->кусок[0][0][0]->материал = 4;
Я получаю сообщение об ошибке:
error: base operand of '->' has non-pointer type 'boost::detail::multi_array::sub_array<octreenode, 1u>'|
"octreenode" имеет соответствующий конструктор, и эта строка работала с идентичным синтаксисом, когда была просто:
корень->планета[0]->кусок[0]->материал = 4;
(с одномерным массивом). Точно так же, хотя он отлично скомпилирован с одномерным массивом, пытаясь передать фрагмент функциям, которые ожидают указатель на объект «octreenode», например:
compactoctree(root->planet[p]->chunk[cz][cx][cy], 0, 14);
генерирует ошибку
error: cannot convert 'boost::detail::multi_array::sub_array<octreenode, 1u>' to 'octreenode*' for argument '1' to 'short int compactoctree(octreenode*, int, int)'|
Был бы очень признателен за любые предложения, я уверен, что упускаю что-то очевидное.